java 更新jlabel_java - 用Java更新绑定的JLabel文本 - 堆栈内存溢出
當我運行您發布的代碼時,我收到了NullPointerException 。 這是堆棧跟蹤的一部分。 (請注意,我的環境是[64位] Windows 10上的JDK 13.0.1。)
Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: contentPane cannot be set to null.
at java.desktop/javax.swing.JRootPane.setContentPane(JRootPane.java:598)
at java.desktop/javax.swing.JFrame.setContentPane(JFrame.java:679)
at generalp/guitests.mouse_input.displayJframe(mouse_input.java:27)
您發布的這一行代碼導致了錯誤。
frame.setContentPane(new mouse_input().mouse_pad);
這是因為mouse_pad從未初始化。
這很容易解決。
private JPanel mouse_pad = new JPanel();
當我運行更改的代碼時,將顯示以下窗口。
這是因為JPanel與所有Swing容器一樣,沒有定義的大小,因為它采用了其包含的[GUI]組件的大小。 實際上,方法pack()將JFrame大小調整為足以容納所有包含的組件的大小,并且唯一包含的組件是大小為零的JPanel 。 因此,對于您發布的代碼,為了擁有合適的尺寸窗口,我們需要顯式設置尺寸。 所以我們需要(例如)而不是pack() )
frame.setSize(400, 300);
現在,當我運行更新的代碼時,我得到
label在哪里? 根據您發布的代碼,它永遠不會添加到frame 。 您要向frame添加兩個組件,即mouse_pad和label 。 如果將mouse_pad設置為“內容窗格”,那么您將無處可去,無法添加label 。 這是布局管理器變得重要的地方。 不幸的是,如果您不熟悉Swing并且依賴GUI構建器,那么如何利用布局管理器來組織您希望顯示的所有組件并不是很明顯。 我認為學習基礎知識很重要。 GUI構建器適用于熟悉Swing并且知道如何利用該構建器節省時間和精力的程序員。 它不是學習Swing或縮短學習曲線的工具。 因此,作為了解基礎知識的人,我知道內容窗格的默認布局管理器是BorderLayout ,因此在您發布的代碼中,我現在將對setContentPane()方法的調用替換為以下內容。
frame.add(mouse_pad, BorderLayout.CENTER);
createUIComponents(); // in order to initialize member 'label'
frame.add(label, BorderLayout.PAGE_START);
最后,您需要向接收鼠標運動事件的組件添加MouseMotionListener 。 這不是JFrame而是JPanel ,在這種情況下為mouse_pad 。 此外,GUI構建器可能不會讓你知道類MouseMotionAdapter它實現MouseMotionListener與空的方法,因此,如果你寫一個類,它擴展MouseMotionAdapter你只需要執行相關的方法,而不是所有的方法,這說明你在注意什么在您發布的代碼中進行以下注釋。
// It doesn't like me deleting this
這是固定代碼。 這不是最好的實現,但它回答了您的問題,基本上是:
我的代碼不起作用。 我應該如何更改才能使其正常工作?
import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class MouseInput {
private JPanel mouse_pad = new JPanel();
private JLabel label;
private static int x;
private static int y;
public static void main(String[] args) {
MouseInput instance = new MouseInput();
SwingUtilities.invokeLater(new Runnable(){
public void run(){
instance.createUIComponents();
instance.displayJframe();
}
});
}
public void displayJframe(){
// Create blank content frame
JFrame frame = new JFrame("Mouse Input");
frame.add(mouse_pad, BorderLayout.CENTER);
frame.add(label, BorderLayout.PAGE_START);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setVisible(true);
// Add mouse motion listener
mouse_pad.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
x = e.getX();
y = e.getY();
label.setText("X = " + x + " , Y = " + y);
}
});
// Set cursor type
frame.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
// Display frame
frame.setVisible(true);
}
private void createUIComponents() {
label = new JLabel();
label.setText("X = " + x + " , Y = " + y);
}
}
但是,如果您只是開始使用Java進行GUI編程,那么您是否考慮過JavaFX ,它打算作為Swing的更現代的替代品。
總結
以上是生活随笔為你收集整理的java 更新jlabel_java - 用Java更新绑定的JLabel文本 - 堆栈内存溢出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android4.0.3 修改启动动画和
- 下一篇: Java如何定义三个圆_java – 以