簡體   English   中英

Java:在AbsoluteLayout中,直到鼠標進入JButton才會顯示

[英]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) {}

}

您的程序中存在多個錯誤:

  1. 您正在使用AbsoluteLayout ,最后它仍然是一個null layout ,請參見Null布局是邪惡的為什么在Swing中使用null布局會被皺眉? 雖然絕對定位似乎是為Swing初學者制作復雜GUI的最快和最簡單的方法,但是您在程序中進行的開發越多,由於此而導致的錯誤就越多。 如果需要,可以使用布局管理器或它們的組合以及空邊框來增加間距。

  2. 您正在創建一個JFrame對象並擴展JFrame ,換句話說,使您的類成為JFrame 如果您確實需要擴展JPanel ,則無需擴展JFrame ,可以稍后將其添加到其他組件中,而JFrame則不能。

  3. 在將所有組件添加到其中之前,您要使JFrame可見,這就是導致錯誤的原因,並且可能也是第一個錯誤。 在將所有組件添加到其中之后,應該只在最后顯示它。

添加所有組件后,將JFrame設置為可見( jf1.setVisible(true); )。 (構造函數的結尾)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM