【问题标题】:Java: In AbsoluteLayout, JButtons do no show up until the mouse enters itJava:在 AbsoluteLayout 中,JButton 在鼠标进入之前不会显示
【发布时间】:2016-12-23 18:36:19
【问题描述】:

我已将我的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) {}

}

【问题讨论】:

    标签: java swing jpanel jbutton


    【解决方案1】:

    您的程序中有多个错误:

    1. 你使用的是AbsoluteLayout,最后它仍然是null layout,见Null layout is evilWhy is it frowned upon to use a null layout in Swing?。虽然绝对定位似乎是为 Swing 初学者制作复杂 GUI 的最快和最简单的方法,但您在程序中的进步越多,由此产生的错误就越多。如果需要,请改为使用Layout Manager 或它们的组合以及Empty borders 以获得额外的间距。

    2. 您正在创建一个JFrame 对象并扩展JFrame,换句话说,使您的类成为JFrame!如果您确实需要扩展 JPanel 可以在以后添加到其他组件中而 JFrame 不能,则无需扩展 JFrame

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢!你能向我解释一下为什么这样可以让我有知识/理解,而且我不只是从网上记住代码吗?
      • 这里有一个很好的解释:stackoverflow.com/questions/10790457/…
      猜你喜欢
      • 1970-01-01
      • 2013-01-04
      • 2015-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      相关资源
      最近更新 更多