私はGUIで絶対配置でnullレイアウトを使用するという悪い習慣について読んだので、レイアウトについて学びたいと思っています。場合は、GUIを動的に拡張する柔軟性を奪う。だから私はGUIブロックのいくつかの組み合わせを試している、今私は問題が発生しました。以下は、私が試してみるつもりGUIブロックです:Java Swing Layoutブロック
私は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ビルダーを使用することをお勧めします。複雑なレイアウトを手作業で構築するよりもはるかに簡単です。 Docs:https://docs.oracle.com/javase/tutorial/uiswing/layout/using.html – markspace
私はWindows Builderを探していましたが、Eclipseネオンはダウンロードできず、インストールできませんでした。だから私はそれを難しい方法でやらなければならなかった。 : – Bou