给你个例子,对照一下看看。
再不行把源码发来看看
import javaawt;
import javaawtevent;
import javaxswing;
public class ComboBoxTest {
public static void main(String[] args) {
ComboBoxFrame frame = new ComboBoxFrame();
framesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
framesetVisible(true);
}
}
class ComboBoxFrame extends JFrame {
private JComboBox faceCombo;
private JLabel label;
private static final int DEFAULT_SIZE = 12;
public ComboBoxFrame() {
setTitle("ComboBoxTest");
setSize(300,200);
label = new JLabel("The quick brown fox jumps over the lazy dog");
labelsetFont(new Font("Serif", FontPLAIN, DEFAULT_SIZE));
add(label, BorderLayoutCENTER);
faceCombo = new JComboBox();
faceCombosetEditable(true);
faceComboaddItem("Serif");
faceComboaddItem("SansSerif");
faceComboaddItem("Monospaced");
faceComboaddItem("Dialog");
faceComboaddItem("DialogInput");
faceComboaddActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
labelsetFont(new Font((String)faceCombogetSelectedItem(), FontPLAIN, DEFAULT_SIZE));
}
});
JPanel comboPanel = new JPanel();
comboPaneladd(faceCombo);
add(comboPanel, BorderLayoutSOUTH);
}
}
是的,最外面的window的大小是包括标题栏在内的,而且标题栏是native修饰的,高度不定。(windows下和linux下不同,windows xp和2000下都不同)
计算内置子组件的位置不要用window作为相对坐标的参考系,用contentpane,就是ContainergetContentPane()得到的那个,对于最外层window来说,这个就是剥掉外层修饰可以放子组件的最大范围了,就是最高不能高过contentpane的y,最左左不过contentpane的x。
补充:
由于对于一定的native的修饰,比如标题栏的高度之类是固定的,所以最外层window的size定下来后,contentpane理论上也是固定下来的。但是contentpane其实作为window的一个子组件,其size的计算不是在构造时候完成的,也就是下面这段code里得到的contentpane的size还是(0,0)
JFrame aFrame = new JFrame();
aFramesetSize(100, 100);
Container contentPane = aFramegetContentPane();
两种解决方法:
1 最常用的方法布局时利用各种现成的LayoutManager,而不推荐自己去从头写代码来计算内部组件的大小。(SUN的一些现成的一些LayoutManager已经基本可以满足要求,还有一些第三方的LayoutManager可以做进一步补充,自己也可以在其基础上重载定制,但实用中几乎没有必要)。这样只要告诉LayoutManager各个内部组件相对的位置和占有的大小比例关系即可。
2 非要自己来计算确切的位置大小也不是不可以,但除非所有组件的大小都由你来确定,此外一般不在构造的时候确定,原因就在于一开始的问题,window大小确定后,默认布局计算算法是lazy的,这是contentPane的大小还是0,直到必须计算的时候才确定。所以要确保自己写的计算位置和大小的代码也要在parent的布局计算完成后才能调用。比如计算contentPane里面子组件位置代码可以让其被contentPane的doLayout()回调。当然你一般不想重载contentPane,那么就在其里面直接套一层JPanel好了,重载该JPanel的doLayout() 这种方法不推荐,不如把算法放在LayoutManager更能使得逻辑耦合度降低。
针对补充的再补充:方法一就是用LayoutManager,方法二就是对某个container整个跳过或在LayoutManager调整之后再进行附加调整,通过重载ContainerdoLayout()在该方法内直接通过计算setBounds。
关于"针对补充的再补充"的再三补充:重载JDK Container里的doLayout(),在该函数内,可以完全用自己的计算代码,也可以调用过super之后再用自己的算法调整,super就是调用默认LayoutManager(设成null就不动作)。所以super之后(不能在之前)的定制调整会是能够覆盖默认布局效果的。在Container里调整的是子componet。
不明白为何不用方法一中逻辑清晰的方法,非要折腾这个呢?
import javaawtDimension;
import javaawtToolkit;
import javaawteventActionEvent;
import javaawteventActionListener;
import javautilEnumeration;
import javaxswingAbstractButton;
import javaxswingButtonGroup;
import javaxswingJFrame;
import javaxswingJLabel;
import javaxswingJRadioButton;
public class Index {
private JLabel sexLabel;
private JRadioButton manRadioButton;
private JRadioButton womanRadioButton;
private JLabel answerLabel;
public void add(JFrame frame) {
framesetLayout(null);
sexLabel = new JLabel("性别:");
sexLabelsetBounds(120, 100, 40, 20);
manRadioButton = new JRadioButton("男", true);// 创建指定文本和选择状态的单选按钮对象
manRadioButtonsetBounds(170, 100, 50, 20);
manRadioButtonaddActionListener(new ActionListener() {// 捕获单选按钮被选中的事件
public void actionPerformed(ActionEvent e) {
answerLabelsetText("您选中的单选按钮是:"
+ manRadioButtongetText());// 设置提示标签的内容
}
});
womanRadioButton = new JRadioButton("女");// 创建指定文本的单选按钮对象
womanRadioButtonsetBounds(230, 100, 50, 20);
womanRadioButtonaddActionListener(new ActionListener() {// 捕获单选按钮被选中的事件
public void actionPerformed(ActionEvent e) {
answerLabelsetText("您选中的单选按钮是:"
+ womanRadioButtongetText());// 设置提示标签的内容
}
});
ButtonGroup sexRadioButtonGroup = new ButtonGroup();// 创建一个选按钮组对象
sexRadioButtonGroupadd(manRadioButton);// 将单选按钮对象添加到按钮组对象中
sexRadioButtonGroupadd(womanRadioButton);// 将单选按钮对象添加到按钮组对象中
answerLabel = new JLabel();
answerLabelsetBounds(120, 140, 200, 20);
Enumeration<AbstractButton> elements = sexRadioButtonGroup
getElements();// 遍历按钮组中的所有按钮
while (elementshasMoreElements()) {
AbstractButton button = elementsnextElement();
if (buttonisSelected())// 设置提示标签的默认内容
answerLabelsetText("默认选中的单选按钮是:" + buttongetText());
}
frameadd(sexLabel);
frameadd(manRadioButton); // 将单选按钮添加到JFrame窗口中
frameadd(womanRadioButton); // 将单选按钮添加到JFrame窗口中
frameadd(answerLabel);
}
public static void main(String[] args) {
JFrame frame = new JFrame("利用JFrame创建窗口");// 创建指定标题的JFrame窗口对象
framesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);// 关闭按钮的动作为退出窗口
framesetSize(400, 300);// 设置窗口大小
Dimension displaySize = ToolkitgetDefaultToolkit()getScreenSize();// 获得显示器大小对象
Dimension frameSize = framegetSize();// 获得窗口大小对象
if (frameSizewidth > displaySizewidth)
frameSizewidth = displaySizewidth;// 窗口的宽度不能大于显示器的宽度
if (frameSizeheight > displaySizeheight)
frameSizeheight = displaySizeheight;// 窗口的高度不能大于显示器的高度
framesetLocation((displaySizewidth - frameSizewidth) / 2,
(displaySizeheight - frameSizeheight) / 2);// 设置窗口居中显示器显示
Index index = new Index();
indexadd(frame);// 向JFrame窗口添加标签
framesetVisible(true);// 设置窗口为可见的,默认为不可见
}
}
JFrame这样的框架,一旦创建,在其中就已经包含一个内容面板,一般我们在往JFrame中添加组件时,都加在了内容面板中,这个面板可以通过JFrame的成员方法getContentPane()取出来,
所以如果设置JFrame的背景颜色,仍然会被内容面板盖住,不如设置内容面板的背景颜色
当时如果框架中还加有其他面板,内容面板的颜色也会被其他面板盖住,要注意一下面板的布局情况
我已经帮你改好了,可以显示正确了,你看看我注释的地方,还有一点就是,你要知道一些容器的默认布局,frame是borderlayout ,panel是folowlayout
import javaxswing;
import javaawt;
import javaawtevent;
//程序运行后首先进入登录界面,点击Log on按钮后进入主界面
class FrameChange extends JFrame {
private JPanel contentpane = new JPanel();
private JButton login = new JButton("Login on");
void init() {
setSize(600, 400);
setLocation(100, 100);
setTitle("Test");
setBackground(Colorgray);
setDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
contentpaneadd(login);
loginaddActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
MainPanel mp = new MainPanel();
mpadd(new JLabel("Hello,this is MainPanel"));
setContentPane(mp);
// getContentPane()add(mp,BorderLayoutCENTER); //如果用这行获取内容面板,运行后点击按钮无法显示新的内容
//paint();//要添加此句,让frame刷新下
//如果你要用getContentPane()的话,就要调用paint()方法,这样可以刷新JFrame
//但是我试了,显示不出来label的字,我还在看,等弄好了,我再给你补改
}
});
getContentPane()add(contentpane,BorderLayoutNORTH);
setVisible(true);
}
void paint(){
thisrepaint();
}
FrameChange() {
init();
}
public static void main(String[] args) {
FrameChange fc = new FrameChange();
}
}
// 主界面
class MainPanel extends JPanel {
// 创建一个面板,等等我把这个设置为内容面板,就像看看是否能变换Frame中的Panel
protected JPanel mainpanel = new JPanel();
JLabel hello = new JLabel("Hello,this is MainPanel");
void init() {
setSize(300, 200);
setLocation(100, 100);
setBackground(Colorred);
mainpaneladd(hello);// 我这里添加了一个标签,但是运行后没有显示出来。。郁闷
thisadd(mainpanel);//你开始没有加上你自己定义的panel当然不会显示你的lable了
setVisible(true);
}
MainPanel() {
init();
}
}
最简单的方法:
JFrame mainframe = new JFrame("五子棋");
mainframesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
JPanel cp = (JPanel) mainframegetContentPane();
cpsetLayout(new BorderLayout());
ImageIcon background = new ImageIcon("D:\\java documents\\Gobang\\棋盘jpg");
JLabel label=new JLabel(background);
cpadd("Center", label);
mainframepack();
mainframesetVisible(true);
不管用哪种方法,由于窗口有最小大小限制(主要是要显示标题栏上的按钮,所以如果设置成不要按钮,就可以不用本限制,但Jframe不好办,需要用其他类型的窗口),所以如果过窄的话,两边会显示空白。
以上就是关于如何设置JComboBox下拉框高度全部的内容,包括:如何设置JComboBox下拉框高度、java编的窗口最上方的标题栏高度是多少、java编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)