Java JButton仅出现在鼠标上方

Java JButton仅出现在鼠标上方,java,jpanel,jbutton,Java,Jpanel,Jbutton,我的问题是,我的JButton只有在我将鼠标移到按钮应该所在的位置时才会出现。我尝试了很多解决方案,比如使用paintComponents()而不是paint()、使用repaint()、setVisible()等等,但都没有任何帮助。如果我把它注释掉,我肯定问题出在文本区域:pnlBackground.add(txt),程序启动时按钮弹出,但文本区域不显示。有什么想法吗 public class MediGraph extends JFrame { private JPanel pnlBac

我的问题是,我的JButton只有在我将鼠标移到按钮应该所在的位置时才会出现。我尝试了很多解决方案,比如使用paintComponents()而不是paint()、使用repaint()、setVisible()等等,但都没有任何帮助。如果我把它注释掉,我肯定问题出在文本区域:
pnlBackground.add(txt),程序启动时按钮弹出,但文本区域不显示。有什么想法吗

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();

}}
公共类MediGraph扩展JFrame{
私人JPanel pnlBackground;
私人JPanel pnlGraph;
私有JTextareaTXT;
私人JButton btnFileChooser;
专用JFileChooser fcFiler;
公共静态字符串fileName=“Langzeitblutdruck_PID34567.txt”;
公共MediGraph(){
//JFrame
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
设置尺寸(新尺寸(900420));
setLocationRelativeTo(空);
可设置大小(假);
setTitle(“MediGraph”);
//PNL背景
pnlBackground=newjpanel();
pnlBackground.setLayout(空);
pnlBackground.立根(0,0,650,420);
//气压计
pnlGraph=new JPanel();
pnlGraph.setLayout(空);
pnlGraph.setBounds(0,0,650,370);
pnlBackground.add(pnlGraph);
//JTextArea
txt=新的JTextArea();
txt.setBounds(620,5270305);
//fcFiler
fcFiler=newjfilechooser();
//btnFileChooser
btnFileChooser=新的JButton(“Datei einlesen”);
btnFileChooser.立根(250335135,30);
btnFileChooser.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
fcFiler.showOpenDialog(btnFileChooser);
if(fcFiler.getSelectedFile()!=null){
fileName=fcFiler.getSelectedFile().getAbsolutePath();
System.out.println(文件名);
重新油漆();
}
}
});
pnlBackground.add(txt);
pnlBackground.add(btnfelechooser);
添加(pnlBackground);
setVisible(真);
}
公共空间涂料(图g){
g=this.pnlGraph.getGraphics();
色差=新色差(204,0,0);//法本·für·阿奇森,坚定和收缩
颜色green=新颜色(0,195,0);
靛蓝色=新颜色(128,0128);
g、 clearRect(0,0600700);
//x和y轴
g、 色(靛蓝);
g、 抽绳(27,15,27,300);
g、 抽绳(27300600300);
//阿奇森背衬
对于(int i=27;i<600;i+=20){
g、 抽绳(i,298,i,302);
如果(i<300)
g、 抽绳(24,i,30,i);
}
//贝什里夫顿缺席
//y-乙酰胆碱酯酶
g、 抽绳(“100”、5213);
g、 抽绳(200、5113);
g、 抽绳(“300”、5、13);
g、 抽绳(“Werte”,35,23);
//x-乙酰胆碱酯酶
g、 抽绳(“5”、125、314);
g、 抽绳(“10”、225、314);
g、 抽绳(“15”、325、314);
g、 抽绳(“20”、425、314);
g、 抽绳(“25”、525、314);
g、 抽绳(“在斯泰登”,548319);
//布草
g、 抽绳(60530059595);
g、 抽绳(605300595305);
g、 抽绳(27,14,22,22);
g、 抽绳(27,14,32,22);
//Firmenlogo:)
g、 setFont(新字体(“Times new Roman”,Font.ITALIC,20));
g、 setColor(HeretsuEnt);
g、 抽绳(“Heretsu Enterprises”,400355);
//勒让德
g、 setFont(新字体(“Arial”,Font.LAYOUT_LEFT_TO_RIGHT,15));
g、 setColor(Color.RED);
g、 抽绳(100320120320);
g、 抽绳(“Puls”,30,325);
g、 setColor(Color.BLUE);
g、 抽绳(100340120340);
g、 抽绳(“舒张期”,30345);
g、 色(绿色);
g、 抽绳(100360120360);
g、 抽绳(“收缩期”,30,365);
//石墨烯
Untersuchung Untersuchung=新的Untersuchung();
lesen.lesen(文件名);
ArrayList Messwert=untersuchung.getMesswert();
g、 setColor(HeretsuEnt);
g、 抽绳(文件名,200,15);
字符串ausgabe=“Datum”+“Uhrzeit”+“收缩”+“舒张”+“Puls”+“\n”;
对于(int i=0;i
您有很多问题

让我们从
setLayout(null)开始

避免使用
null
布局,像素完美的布局在现代ui设计中是一种错觉。影响零部件单个尺寸的因素太多,您无法控制。Swing的设计初衷是与布局管理器一起工作,丢弃这些布局管理器将导致无止境的问题,您将花费越来越多的时间来纠正这些问题

虽然这可能“看起来”是一个好主意,但事实并非如此,而且你最终会遇到很多小问题,这些问题几乎是随机出现在不同的计算机上。布局管理API旨在克服这些问题,使您的生活更轻松

接下来,绘画

public void paint(Graphics g){

    g = this.pnlGraph.getGraphics();
您重写了
JFrame
paint
,这本身并不推荐,但随后您无法调用
super.paint
,wh