如何设置JComboBox下拉框高度

如何设置JComboBox下拉框高度,第1张

给你个例子,对照一下看看。

再不行把源码发来看看

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) {

framesetTitle("单选按钮的使用方法");

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编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9740265.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存