setSize 僅適用于 EventListner。它與 setPreferredSize 一起使用。為什么它不能與 EventListner 之外的 setSize 一起使用?
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Main {
static int keyRange = 0;
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
frame.setLocationRelativeTo(null);
frame.setSize(500, 600);
JButton addMapkey = new JButton("Add mapkey");
JTextField mapKey = new JTextField("Mapkey" keyRange);
JLabel allKeys = new JLabel();
panel.add(mapKey);
panel.add(addMapkey);
panel.add(allKeys);
panel.setLayout(new java.awt.FlowLayout());
frame.getContentPane().add(panel);
frame.setVisible(true);
mapKey.setSize(mapKey.getText().length()*9, addMapkey.getHeight());
System.out.println(addMapkey.getHeight());
addMapkey.addActionListener(e -> {
keyRange ;
mapKey.setText("Mapkey" keyRange);
mapKey.setSize(mapKey.getText().length()*9, addMapkey.getHeight());
});
}
}
uj5u.com熱心網友回復:
對 Swing 和 AWT 組件的所有修改都必須在事件調度執行緒上執行,如Java SE 教程的初始執行緒和事件調度執行緒部分所述。
來自這些頁面的報價:
為什么初始執行緒不簡單地創建 GUI 本身?因為幾乎所有創建或與 Swing 組件互動的代碼都必須在事件調度執行緒上運行。
Swing 事件處理代碼在稱為事件調度執行緒的特殊執行緒上運行。大多數呼叫 Swing 方法的代碼也在該執行緒上運行。這是必要的,因為大多數 Swing 物件方法不是“執行緒安全的”:從多個執行緒呼叫它們有執行緒干擾或記憶體一致性錯誤的風險。一些 Swing 組件方法在 API 規范中被標記為“執行緒安全”;這些可以從任何執行緒安全地呼叫。所有其他 Swing 組件方法都必須從事件分派執行緒中呼叫。忽略此規則的程式在大多數情況下可能會正常運行,但會出現難以重現的不可預測的錯誤。
(上面的重點是我的)。
上面的代碼忽略了這些規則,因此會出現難以重現的不可預測的錯誤。
請檢查上面的教程并修改代碼以遵循規則。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/323068.html
