Java: 在 AbsoluteLayout 中,JButtons 在鼠标进入之前不会出现

Java: In AbsoluteLayout, JButtons do no show up until the mouse enters it

我已将我的 Layout 切换为 AbsoluteLayout 并且一切都在需要的地方,但是当我 运行 我的程序时,我的 JButtons 是在我将鼠标悬停在它们上面之前是不可见的。我应该更改什么以使它们始终可见,是否输入鼠标?

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import java.awt.Color;
import java.awt.Cursor;

public class Library extends JFrame implements ActionListener, MouseListener {

private JFrame jf1;
private JPanel jp1;
private JTextField jtf1;
private JTextField jtf2;
private JTextField jtf3;
private JButton jb1;
private JButton jb2;
private JButton jb3;

public Library() {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch(Exception ee) {
        ee.printStackTrace();
    }
    JFrame.setDefaultLookAndFeelDecorated(false);
    jf1 = new JFrame("Library");
    jf1.setVisible(true);
    jf1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf1.setSize(1080, 900);
    jf1.setResizable(true);
    jf1.getContentPane().setLayout(null);

    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    jf1.setLocation(dim.width/2-jf1.getSize().width/2, dim.height/2-jf1.getSize().height/2);

    jp1 = (JPanel) jf1.getContentPane();

    jb1 = new JButton("Genre");
    jb1.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
    jb1.setBounds(345, 11, 150, 60);
    jb1.addActionListener(this);

    jb2 = new JButton("Author");
    jb2.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
    jb2.setBounds(494, 11, 150, 60);
    jb2.addActionListener(this);

    jb3 = new JButton("Title");
    jb3.setDefaultCapable(false);
    jb3.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
    jb3.setBounds(643, 11, 150, 60);
    jb3.addActionListener(this);

    jtf2 = new JTextField("Enter Text");
    jtf2.setBounds(445, 292, 200, 20);
    jtf2.addMouseListener(this);
    jtf2.setVisible(false);

    jtf3 = new JTextField("Enter Text");
    jtf3.setBounds(671, 351, 200, 20);
    jtf3.addMouseListener(this);
    jtf3.setVisible(false);

    jp1.add(jtf2);

    jtf1 = new JTextField("Enter Text");
    jtf1.setBounds(236, 230, 200, 20);
    jtf1.addMouseListener(this);
    jtf1.setVisible(false);

    jp1.add(jtf1);
    jp1.add(jtf3);
    jp1.add(jb1);
    jp1.add(jb2);
    jp1.add(jb3);

    jf1.validate();
}

@Override
public void actionPerformed(ActionEvent e) {
    Object code = e.getSource();
    if (code == jb1) {
        jtf1.setVisible(true);
        jp1.validate();
    }
    else if (code == jb2) {
        jtf2.setVisible(true);
        jp1.validate();
    }
    else if (code == jb3) {
        jtf3.setVisible(true);
        jp1.validate();
    }
}

public static void main(String[] args) {
    Library shoe = new Library();
}

@Override
public void mouseClicked(MouseEvent eee) {
    Object mouseCode = eee.getSource();
    if(mouseCode == jtf1) {
        jtf1.selectAll();
    } 
    if(mouseCode == jtf2) {
        jtf2.selectAll();
    }
    if(mouseCode == jtf3) {
        jtf3.selectAll();
    }
}

@Override
public void mouseEntered(MouseEvent eee) {}

@Override
public void mouseExited(MouseEvent eee) {}

@Override
public void mousePressed(MouseEvent eee) {}

@Override
public void mouseReleased(MouseEvent eee) {}

}

添加所有组件后,将 JFrame 设置为可见 (jf1.setVisible(true);)。 (构造函数结束)

您的程序中存在多个错误:

  1. 您正在使用 AbsoluteLayout,但最终它仍然是 null layout,如果需要,请参阅 Null layout is evil and Why is it frowned upon to use a null layout in Swing?. While absolute positioning might seem like the fastest and easiest way to make complex GUI's for Swing beginners, the more you advance in your program the more errors you'll get due to this. Instead use a Layout Manager or combinations of them along with Empty borders 了解额外的间距。

  2. 您正在创建一个 JFrame 对象并扩展 JFrame,换句话说,使您的 class 成为 JFrame!没有必要扩展 JFrame 如果你真的需要扩展一些东西 extend a JPanel 可以在以后添加到其他组件中而 JFrame 不能。

  3. 您在将所有组件添加到其中之前就让 JFrame 可见,这就是您出错的原因,也可能是第一个错误。你应该让它在最后才可见,在你添加了所有你的组件之后。