我正在嘗試瞭解佈局,因爲我已閱讀了關於不良實踐的內容,以便在GUI中使用絕對定位的空佈局。如果帶動動態擴展GUI的靈活性。所以我嘗試了一些GUI塊的組合,現在我遇到了一個問題。下面是GUI塊我打算嘗試:Java Swing佈局塊
我開始通過執行GUI的頂部部分(塊1,2 & 3),並將其與下面的代碼工作:
public class LayoutTestGuiDelegate implements Observer{
private LayoutTestModel model;
private int totalScreenWidth;
private int totalScreenHeight;
private JFrame mainFrame;
private JPanel totalScreen;
private JPanel topScreen;
private JPanel botScreen;
private JPanel dateScreen;
private ImagePanelOne imagePanelOne;
private ImagePanelTwo imagePanelTwo;
private ImagePanelThree imagePanelThree;
private ImagePanelFour imagePanelFour;
private ImagePanelFive imagePanelFive;
public LayoutTestGuiDelegate(LayoutTestModel model){
this.model = model;
totalScreenWidth = model.GetScreenWidth();
totalScreenHeight = model.GetScreenHeight();
SetupComponents();
}
public void SetupComponents(){
// set it to full exclusive mode
final GraphicsDevice fullScreen = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
mainFrame = new JFrame("Video Clock Display");
mainFrame.setLayout(new GridLayout(1, 1, 0, 0));
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setUndecorated(true); // Remove title bar
mainFrame.setAlwaysOnTop(false); // Always on top
mainFrame.setResizable(false);
mainFrame.setVisible(true);
totalScreen = new JPanel(new GridLayout(2, 1, 0, 0));
mainFrame.setContentPane(totalScreen);
topScreen = new JPanel(new GridLayout(1, 2, 0, 0));
imagePanelOne = new ImagePanelOne(model, 1020, 280);
topScreen.add(imagePanelOne);
dateScreen = new JPanel(new GridLayout(2, 1, 0, 0));
imagePanelTwo = new ImagePanelTwo(model, 900, 150);
dateScreen.add(imagePanelTwo);
imagePanelThree = new ImagePanelThree(model, 900, 130);
dateScreen.add(imagePanelThree);
topScreen.add(dateScreen);
totalScreen.add(topScreen);
mainFrame.pack();
}
@Override
public void update(Observable arg0, Object arg1) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
imagePanelOne.repaint();
imagePanelTwo.repaint();
imagePanelThree.repaint();
imagePanelFour.repaint();
imagePanelFive.repaint();
}
});
}
}
當我嘗試在底部(塊4 & 5)加入,一切都只是去奇怪的。它顯示了這樣用下面的代碼:
public class LayoutTestGuiDelegate implements Observer{
private LayoutTestModel model;
private int totalScreenWidth;
private int totalScreenHeight;
private JFrame mainFrame;
private JPanel totalScreen;
private JPanel topScreen;
private JPanel botScreen;
private JPanel dateScreen;
private ImagePanelOne imagePanelOne;
private ImagePanelTwo imagePanelTwo;
private ImagePanelThree imagePanelThree;
private ImagePanelFour imagePanelFour;
private ImagePanelFive imagePanelFive;
public LayoutTestGuiDelegate(LayoutTestModel model){
this.model = model;
totalScreenWidth = model.GetScreenWidth();
totalScreenHeight = model.GetScreenHeight();
SetupComponents();
}
public void SetupComponents(){
// set it to full exclusive mode
final GraphicsDevice fullScreen = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
mainFrame = new JFrame("Video Clock Display");
mainFrame.setLayout(new GridLayout(1, 1, 0, 0));
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setUndecorated(true); // Remove title bar
mainFrame.setAlwaysOnTop(false); // Always on top
mainFrame.setResizable(false);
mainFrame.setVisible(true);
totalScreen = new JPanel(new GridLayout(2, 1, 0, 0));
mainFrame.setContentPane(totalScreen);
topScreen = new JPanel(new GridLayout(1, 2, 0, 0));
imagePanelOne = new ImagePanelOne(model, 1020, 280);
topScreen.add(imagePanelOne);
dateScreen = new JPanel(new GridLayout(2, 1, 0, 0));
imagePanelTwo = new ImagePanelTwo(model, 900, 150);
dateScreen.add(imagePanelTwo);
imagePanelThree = new ImagePanelThree(model, 900, 130);
dateScreen.add(imagePanelThree);
topScreen.add(dateScreen);
totalScreen.add(topScreen);
botScreen = new JPanel(new GridLayout(1, 2, 0, 0));
imagePanelFour = new ImagePanelFour(model, 1420, 800);
botScreen.add(imagePanelFour);
imagePanelFive = new ImagePanelFive(model, 500, 800);
botScreen.add(imagePanelFive);
totalScreen.add(botScreen);
mainFrame.pack();
}
@Override
public void update(Observable arg0, Object arg1) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
imagePanelOne.repaint();
imagePanelTwo.repaint();
imagePanelThree.repaint();
imagePanelFour.repaint();
imagePanelFive.repaint();
}
});
}
}
誰能告訴我什麼,我做錯了什麼?謝謝。
只是一個快速評論:Java教程現在建議您使用像NetBeans IDE中內置的GUI構建器。這比使用手工構建複雜佈局要容易得多。文檔:https://docs.oracle.com/javase/tutorial/uiswing/layout/using.html – markspace
我看到,我在尋找Windows生成器,但是我的eclipse霓虹燈無法下載並安裝它。所以我不得不以艱難的方式去做。 :( – Bou