我目前正在开发一个irc bot,今天我想为它创建一个GUI。
我正在尝试创建一个包含左右两个部分的列布局。 左侧将显示控制台输出,右侧将包含所有控件(加入通道,命令等)。
我在创建两列时遇到问题。我有一个JPanel,它是窗口的整个宽度和高度,并有一个10像素的边框,然后我有两个面板;左右。
左侧和右侧面板由于某种原因占据了窗口的整个大小,右侧面板重叠了所有内容。
以下是示例图:http://i.imgur.com/lc4vHVH.png 白色是右侧面板,它应该只有一半大小,并且左侧有一个相同但黑色的面板。
这是我当前的代码,对不起,如果它很乱,是整个Swing GUI的新手......感谢您的帮助。
package tk.TaylerKing.GribbyBot;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.BorderFactory;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import com.alee.laf.WebLookAndFeel;
import com.alee.laf.menu.WebMenuBar;
import com.alee.laf.menu.WebMenuItem;
import com.alee.laf.panel.WebPanel;
import com.alee.laf.rootpane.WebFrame;
public class GribbyBot extends WebFrame {
private static final long serialVersionUID = 4641597667372956773L;
public static HashMap<String, ArrayList<String>> connections = new HashMap<String, ArrayList<String>>();
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel(WebLookAndFeel.class.getCanonicalName());
SwingUtilities.invokeLater(new Runnable(){
public void run(){
GribbyBot gb = new GribbyBot();
gb.setVisible(true);
}
});
}
public GribbyBot(){
WebPanel panel = new WebPanel();
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
panel.setPreferredSize(new Dimension(780, 580));
WebMenuBar menu = new WebMenuBar();
WebMenuItem file = new WebMenuItem("Exit");
file.setMnemonic(KeyEvent.VK_E);
file.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
menu.add(file);
setJMenuBar(menu);
WebPanel left = new WebPanel();
left.setPreferredSize(new Dimension(380, 580));
left.setBackground(Color.BLACK);
WebPanel right = new WebPanel();
right.setPreferredSize(new Dimension(380, 580));
right.setBackground(Color.WHITE);
add(panel);
panel.add(left);
panel.add(right);
setTitle("GribbyBot");
setSize(800, 600);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
}
}
另外,所有以“Web”为前缀的变量都与Swing相同,但它是一个自定义GUI。
答案 0 :(得分:3)
覆盖JComponent#getPreferredSize()而非使用setPreferredSize()
了解更多Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?
如果Performing Custom Painting非常需要,请尝试以这种方式:
示例代码:
final JPanel panel = new JPanel(){
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
// your custom painting code here
}
@Override
public Dimension getPreferredSize() {
return new Dimension(40, 40);
}
};
为什么使用setPreferredSize()
方法,而您可以使用任何适当的布局轻松实现此设计,例如BoxLayout
,GridLayout
,BorderLayout
等。
详细了解布局How to Use Various Layout Managers
尝试JPanel panel = new JPanel(new GridLayout(1,2));