2015-02-23 2 views
-1

У меня проблема с тем, что мой JButton появляется только в том случае, если я перемещаю мышь над положением, где должна быть кнопка. Я пробовал много разрешений, таких как paintComponents() вместо paint(), использовать repaint(), setVisible() и т. Д., Но мне ничего не помогло. Я уверен, что проблема в TextArea, если я прокомментирую это: pnlBackground.add(txt);, кнопка появляется, когда запускается программа, но TextArea не появляется. Есть идеи?JButton появляется только на мышке

public class MediGraph extends JFrame { 

private JPanel pnlBackground; 
private JPanel pnlGraph; 
private JTextArea txt; 
private JButton btnFileChooser; 
private JFileChooser fcFiler; 
public static String fileName = "Langzeitblutdruck_PID34567.txt"; 

public MediGraph(){ 
    //JFrame 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(new Dimension(900,420)); 
    setLocationRelativeTo(null); 
    setResizable(false); 
    setTitle("MediGraph"); 
    //pnlBackground 
    pnlBackground = new JPanel(); 
    pnlBackground.setLayout(null); 
    pnlBackground.setBounds(0, 0, 650, 420); 
    //pnlGraph 
    pnlGraph = new JPanel(); 
    pnlGraph.setLayout(null); 
    pnlGraph.setBounds(0, 0, 650, 370); 
    pnlBackground.add(pnlGraph); 
    //JTextArea 
    txt = new JTextArea(); 
    txt.setBounds(620, 5, 270, 305); 
    //fcFiler 
    fcFiler = new JFileChooser(); 
    //btnFileChooser 
    btnFileChooser = new JButton("Datei einlesen"); 
    btnFileChooser.setBounds(250, 335, 135, 30); 
    btnFileChooser.addActionListener(new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      fcFiler.showOpenDialog(btnFileChooser); 
      if(fcFiler.getSelectedFile() != null){ 
       fileName = fcFiler.getSelectedFile().getAbsolutePath(); 
       System.out.println(fileName); 
       repaint(); 
      } 
     } 
    }); 

    pnlBackground.add(txt); 
    pnlBackground.add(btnFileChooser); 
    add(pnlBackground); 
    setVisible(true); 

} 

public void paint(Graphics g){ 

    g = this.pnlGraph.getGraphics(); 
    Color HeretsuEnt = new Color (204, 0, 0); //Farben für Achsen, Firmenlogo und Systole 
    Color Greeen = new Color (0, 195, 0); 
    Color Indigo = new Color (128,0,128); 
    g.clearRect(0, 0, 600, 700); 
    //x und y Achse 
    g.setColor (Indigo); 
    g.drawLine (27, 15, 27, 300); 
    g.drawLine (27, 300, 600, 300); 
    // Linien der Achsenabschnitte 
    for (int i = 27; i < 600; i += 20) { 
     g.drawLine (i, 298, i, 302); 
     if(i < 300) 
     g.drawLine (24, i, 30, i); 
    } 
    //Beschriftung Abschnitte 
      //y-Achse 
    g.drawString("100", 5, 213); 
    g.drawString("200", 5, 113); 
    g.drawString("300", 5, 13); 
    g.drawString("Werte",35, 23); 
      //x-Achse 
    g.drawString("5", 125, 314); 
    g.drawString("10", 225, 314); 
    g.drawString("15", 325, 314); 
    g.drawString("20", 425, 314); 
    g.drawString("25", 525, 314); 
    g.drawString("in Stunden",548, 319); 

    // Linen für die Pfeilspitzen 
    g.drawLine (605, 300, 595, 295); 
    g.drawLine (605, 300, 595, 305); 
    g.drawLine (27, 14, 22, 22); 
    g.drawLine (27, 14, 32, 22); 

    //Firmenlogo :) 
    g.setFont(new Font("Times New Roman", Font.ITALIC, 20)); 
    g.setColor(HeretsuEnt); 
    g.drawString ("Heretsu Enterprises",400, 355); 

    //Legende 
    g.setFont(new Font("Arial", Font.LAYOUT_LEFT_TO_RIGHT, 15)); 
    g.setColor(Color.RED); 
    g.drawLine(100, 320, 120, 320); 
    g.drawString("Puls", 30, 325); 

    g.setColor(Color.BLUE); 
    g.drawLine(100, 340, 120, 340); 
    g.drawString("Diastole", 30, 345); 

    g.setColor(Greeen); 
    g.drawLine(100, 360, 120, 360); 
    g.drawString("Systole", 30, 365); 

    //Graphen 
    Untersuchung untersuchung = new Untersuchung(); 
    Auslesen.lesen(fileName); 
    ArrayList messwerte = untersuchung.getMesswerte(); 
    g.setColor(HeretsuEnt); 
    g.drawString(fileName,200, 15); 

    String ausgabe = " Datum "+"  Uhrzeit "+" Systole "+"Diastole "+"Puls "+"\n "; 
    for(int i = 0;i < messwerte.size();i++){ 
     ausgabe += "" +""+((Messwert)messwerte.get(i)).getDatum() + " " + ((Messwert)messwerte.get(i)).getUhrzeit() 
       + "   " + ((Messwert)messwerte.get(i)).getSystole() + "   " + ((Messwert)messwerte.get(i)).getDiastole() + "   " + ((Messwert)messwerte.get(i)).getPuls() +"\n "; 

    } 
    txt.setText(ausgabe); 
    for (int j = 4; j < messwerte.size() - 1; j++) { 
     g.setColor(Color.RED); 
     g.drawLine((j*27/4),(-300 + ((Messwert)messwerte.get(j)).getPuls())/-1,(j+1)*27/4, (-300 + ((Messwert)messwerte.get(j+1)).getPuls())/-1); 
     g.setColor(Color.BLUE); 
     g.drawLine((j*27/4),(-300 + ((Messwert)messwerte.get(j)).getDiastole())/-1,(j+1)*27/4,(-300 + ((Messwert)messwerte.get(j+1)).getDiastole())/-1); 
     g.setColor(Greeen); 
     g.drawLine((j*27/4),(-300 + ((Messwert)messwerte.get(j)).getSystole())/-1,(j+1)*27/4,(-300 + ((Messwert)messwerte.get(j+1)).getSystole())/-1); 
    } 

} 

public static void main(String[] args) { 
    new MediGraph(); 

}} 
+1

У вас есть несколько проблем в вашем коде, достаточно, чтобы убедить меня, что вы Отсутствие значительных элементов работы Java Swing. Вы должны попробовать создать несколько меньших примеров или следовать некоторым учебным пособиям, чтобы улучшить свои навыки. – ControlAltDel

+0

Не используйте пустые макеты; не переопределяйте краску и не вызывайте super.paint; не используйте getGraphics, особенно когда ваша картина одного компонента и пытайтесь использовать графику из другого компонента; не изменять состояние какого-либо компонента прямо или косвенно из-за какого-либо метода рисования – MadProgrammer

ответ

1

У вас есть несколько проблем ...

Давайте начнем с setLayout(null);

Избегайте использование null макетов, пиксельные совершенные макеты является иллюзией в современном дизайне пользовательского интерфейса. Слишком много факторов, которые влияют на индивидуальный размер компонентов, ни один из которых вы не можете контролировать. Swing был разработан для работы с менеджерами компоновки в ядре, отбросив их, не будет конца проблем и проблем, которые вы будете тратить все больше времени на исправление.

Хотя это может показаться хорошей идеей, оно на самом деле это не так, и вы не закончите ни малейших проблем, которые появляются почти случайно на разных компьютерах. API управления компоновкой был разработан для решения этих проблем и облегчения вашей жизни.

Следующая, покраска ...

public void paint(Graphics g){ 

    g = this.pnlGraph.getGraphics(); 

перенастройка paint из JFrame, который в себя не рекомендуется, но тогда вы не вызвать super.paint, который предотвращает кадр из не только сама живопись , но и любые дочерние компоненты.

Теперь, если это не так плохо, вы затем перехватите ссылку на контекст другого компонента Graphics и нарисуйте его с помощью метода paint фрейма. Картина должна нарисовать только компонент CURRENT ...

Никогда не используйте getGraphics, серьезно, это не так, как живопись делается в Swing. Он может вернуть null, и все, что вы рисуете, будет уничтожено в следующем цикле краски компонента. Компонент может быть окрашен отдельно от его контейнера, поэтому контейнер может не знать, что его дочерние компоненты были обновлены по какой-либо причине (например, когда мышь входит или выходит из них)

И затем ... изнутри frame paint метод, который вы вызываете txt.setText(ausgabe); ...

Вы НИКОГДА не должны обновлять состояние компонента или любых дочерних компонентов прямо или косвенно из любого метода paint. Это вызовет бесконечный цикл запросов на перерисовку, которые в конечном итоге будут потреблять ваши циклы процессора и сделать вашу программу непригодной для использования.

Я предлагаю вам вернуться к основам и посмотрим на:

Я также рекомендуем:

  • Вы делаете использование соответствующих макетов
  • Создание пользовательского компонента для вашего графика, простирающимся от JPanel и переопределить это paintComponent метода. Там вам нужно выполнить операции рисования, необходимые для отображения графика ТОЛЬКО. Кроме того, убедитесь, что вы не нарушая лакокрасочное цепь и убедитесь, что вы звоните super.paintComponent, прежде чем выполнять какие-либо пользовательские картины
  • Не переопределять paint из JFrame
Смежные вопросы