我是一个在java中操纵UI的新手,所以请原谅我这个问题我无法在任何地方找到答案。
描述 |我正在尝试做一个纸牌游戏,我有一个引擎类来操纵所有的牌和游戏,我希望引擎告诉用户界面更新得分,卡片位置或卡片图像。
这是我如何启动UI的示例,这里的问题是我没有任何实例使用我在Board类中创建的实例方法来操纵JLabel,我无法在EventQueue之外创建实例因为我违反了“永远不会在UI线程之外操纵/创建UI”
public class Engine {
public StartUp(){
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
} catch (UnsupportedLookAndFeelException e) {
}
new Board().setVisible(true);
}
});
}
}
Board类扩展了JPanel并在构造函数中向ui添加了一些JLabel,并且有几种方法可以更改文本和imgs。
我的问题是如何正确调用这些方法(我创建的方法来改变文本和img),我也打开任何其他关于如何解决这个问题的建议。
*编辑:
这是我的董事会成员的简单例子:
public class Board extends JFrame{
public JLabel img1;
public Board(){
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400, 265);
JPanel body = new JPanel(new GridBagLayout());
getContentPane().add(body);
img1 = new JLabel();
body.add(img1);
}
public void setImg1(String s){
img1.setIcon(new ImageIcon(s));
}
}
我希望能够从Engine访问Board中的setImg1(String s)方法,以便能够在运行时更改当前图像
对不起,如果我表达了我的问题
解决了它将引擎合并到董事会中的问题。
对所有帮助过你的人来说,答案 0 :(得分:2)
public class MainFrame extends JFrame {
public MainFrame() {
super("Demo frame");
// set layout
// add any components
add(new Board()); // adding your board component class
frameOptions();
}
private void frameOptions() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack(); // or setSize()
setVisible(true);
}
public static void main(String[] a) {
JFrame.setDefaultLookAndFeelDecorated(true);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
new MainFrame();
} catch (Exception exp) {
exp.printStackTrace();
}
}
});
}
}
答案 1 :(得分:1)
获取GUI的基本习惯是:
SwingUtilities.invokeLater(new Runnable() {
JFrame frame = new JFrame("My Window Title");
frame.setSize(...);
frame.add(new Board()); // BorderLayout.CENTER by default
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null); // center on main screen
frame.setVisible(true);
});