簡體   English   中英

Java Swing:僅在縮放JFrame后才會顯示JPanel

[英]Java Swing : JPanel only shows up once JFrame is scaled

我當時正在開發一個迷你二十一點游戲,但我必須進入GUI和Im時遇到一個小問題,我在JFrame中有2個JPanel,一旦運行main方法,只有一個會出現,並且在該區域上會出現一個點我指定了第二個面板的位置。 一旦用鼠標向上或向下或向任何方向縮放JFrame,JPanel就會出現在其正確位置。 我有點糾結於如何解決該問題,因為我嘗試了很多不同的嘗試,但無法解決。 任何幫助是極大的贊賞。 這是代碼:

<

import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridBagLayout; import java.awt.GridBagConstraints; import java.awt.Color; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.JFrame ; import javax.swing.JButton ; import javax.swing.JLabel; import javax.swing.JPanel ; import javax.swing.JTextArea; import java.awt.Dimension; import javax.swing.Box; import javax.swing.BoxLayout; public class GUI extends JFrame implements ActionListener { public GUI(){ //Constructor for BlackJack ///Frame///////////////////////////////////////////// super("BlackJack"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBackground(Color.WHITE); setLayout(new GridBagLayout()); setSize(1051,550); setResizable(true); GridBagConstraints gbc = new GridBagConstraints(); GridBagConstraints gbc2 = new GridBagConstraints(); gbc.insets = new Insets(10,10,10,10); gbc2.insets= new Insets(10,10,10,10); // Creating all the necessary panels. JPanel scores = new JPanel(new GridBagLayout()); JPanel dealer = new JPanel(); JPanel player = new JPanel(); JPanel bettingArea = new JPanel(new GridBagLayout()); JPanel messages = new JPanel(); messages.setLayout(new BoxLayout(messages,BoxLayout.PAGE_AXIS)); //Adding the panels to the Frame. gbc2.anchor=GridBagConstraints.NORTHEAST; add(scores,gbc2); gbc2.anchor=GridBagConstraints.LAST_LINE_START; add(bettingArea,gbc2); gbc2.anchor=GridBagConstraints.LAST_LINE_END; add(messages,gbc2); // Setting borders for each Panel. scores.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 3)); bettingArea.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 3)); messages.setBorder(BorderFactory.createLineBorder(Color.BLUE, 3)); ////////End of Frame///////////////////////////////////////////////// //score's Interface ////////////////////////////// ///////////////////////////////////////////////// JButton hit = new JButton("Hit"); JButton check = new JButton("Check"); JLabel plrScore = new JLabel("Player Score"); JLabel dlrScore = new JLabel("Dealer Score"); // Setting Different Border Colors for the Player and Dealer plrScore.setBorder(BorderFactory.createLineBorder(Color.BLUE)); dlrScore.setBorder(BorderFactory.createLineBorder(Color.BLACK)); // Setting up the GridBagConstraints. gbc.gridx=0; gbc.gridy=0; scores.add(plrScore,gbc); gbc.gridx=1; gbc.gridy=0; scores.add(dlrScore,gbc); gbc.gridx=0; gbc.gridy=1; scores.add(hit,gbc); gbc.gridx=1; gbc.gridy=1; scores.add(check,gbc); //bettingArea's Interface ////////////////////////// /////////////////////////////////////////////////// JButton increaseBet = new JButton("Increase"); JButton decreaseBet = new JButton("Decrease"); JTextArea playerBet = new JTextArea("Player Bet"); JTextArea playerCash = new JTextArea("Player Cash"); // Setting Different Borders for the Objects playerBet.setBorder(BorderFactory.createRaisedSoftBevelBorder()); playerCash.setBorder(BorderFactory.createRaisedSoftBevelBorder()); // Setting up the GridBagConstraints. gbc.gridx=0; gbc.gridy=0; bettingArea.add(increaseBet,gbc); gbc.gridx=1; gbc.gridy=0; bettingArea.add(playerBet,gbc); gbc.gridx=0; gbc.gridy=1; bettingArea.add(decreaseBet,gbc); gbc.gridx=1; gbc.gridy=1; bettingArea.add(playerCash,gbc); ////messages Interface///////////////////// JTextArea msg1 = new JTextArea("Message 1"); JTextArea msg2 = new JTextArea("Message 2"); JTextArea msg3 = new JTextArea("Message 3"); JTextArea msg4 = new JTextArea("Message 4"); messages.add(msg1); messages.add(Box.createRigidArea( new Dimension(0,2))); messages.add(msg2); messages.add(Box.createRigidArea( new Dimension(0,2))); messages.add(msg3); messages.add(Box.createRigidArea( new Dimension(0,2))); messages.add(msg4); //Visibility of Panels & JFrame. scores.setVisible(true); bettingArea.setVisible(true); messages.setVisible(true); setVisible(true); } public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub } // Main Method public static void main ( String args[]){ GUI game = new GUI(); }

}

您需要刪除setVisible(true); GUI()構造函數。 而是將其放在main()函數和SwingUtilities.invokeLater() ,如下所示:

public static void main ( String args[]){
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new GUI().setVisible(true);
        }
    });
}

Swing GUI更新和渲染任務應在EDT(事件分發線程)中執行。 上面的電話只是為我們做的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM