有几次我因为建议使用以下方法而受到批评:
在Swing
组件上.当我想在显示的组件之间定义比例时,我没有看到任何替代它们的用法.我被告知这个:
对于布局,答案总是相同的:使用合适的LayoutManager
我在网上搜索了一下,但我没有找到任何关于这个主题的综合分析.所以我有以下问题:
在对问题中提出的问题感兴趣之后, 我试图接近它几次并且失败了,我不喜欢那样:)
我认为如果问题被分成子问题,它可能有助于解决它.
为简单起见,假设JTextArea不会改变其大小,因此我们不需要担心重新评估等.我认为重要的问题是:
1.如何计算某个文本在JTextArea中占用的行数?
2. JTextArea中的列数与它可以放在一行中的字符数之间的关系是什么?所以我们可以计算行长度.
请在下面找到包含要处理的文本区域的示例代码:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
public class TextAreaLines
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
JPanel p = new JPanel();
JFrame f = new JFrame();
JTextArea ta = new JTextArea("dadsad sasdasdasdasdasd");
ta.setWrapStyleWord(true);
ta.setLineWrap(true);
ta.setRows(5);
ta.setColumns(5);
p.add(ta);
f.setContentPane(p);
f.setSize(400, 300);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
//BTW the code below prints 1
System.out.println("ta.getLineCount()="+ta.getLineCount());
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
编辑1:所以我提出了以下代码,但问题是输出不是你看到的,即
//for input
//JTextArea ta = …
Run Code Online (Sandbox Code Playgroud) 我所说的JLabel-JTextField对是一个JLabel组件,后跟一个JTextField组件,例如"参数1:-----",其中"-----"表示空白的JTextField.
问题是,由于参数名称的长度不同,JLabel的宽度会有所不同,因此JTextField的起点不会垂直对齐.
有没有办法将JLabel垂直对齐到右边,以便后面的JTextField的开头会对齐?谢谢.
我GroupLayout
用来管理一些动态生成的数据输入表单中的组件.布局或多或少如此:
*-----------------------------------------------*
| label A | field A |
| label B | field B |
| label C | field C |
*-----------------------------------------------*
Run Code Online (Sandbox Code Playgroud)
我使用2个并行组作为水平布局,使用单个顺序组作为垂直布局.在大多数情况下,一切都很好.
我想将标签的最大宽度(仅仅是实例JLabel
)限制为父级宽度的1/3 JFrame
.如果它JFrame
是一个固定的大小,这将是微不足道的,但我必须处理它被调整大小.
我正在接收ComponentListener.componentResized()
事件,JFrame
但是一旦我收到这样的事件,我就会有点困惑.
我没有运气就试过这种方法:
public void componentResized(ComponentEvent e) {
int maxW = parentFrame.getWidth() / 3;
for (JLabel l : labels) {
l.setMaximumSize( // have also tried setSize() and setPreferredSize()
new Dimension(
Math.min(l.getSize().width, maxW),
l.getMaximumSize().height));
}
groupLayout.invalidateLayout(getContentSpace());
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议一种限制标签宽度的方法吗?
我可能每次都可以从头开始重建布局,但我觉得应该有一种更简单的方法.
何时计算JComponent的大小?在屏幕上显示之后或之前?如果我.getSize()
之前发送消息.setVisible(true)
,它会给我正确答案吗?谢谢
最简单的说,我试图使用组件的宽度来设置其父容器的大小.但是,为组件返回的宽度偏差约4个像素.
更多细节:我有一个对话框,其子面板水平分布在其中间.该对话框应始终与此子面板列表一样宽,并在列表太长时使用滚动条.我尝试使用1个子面板虽然开始.无论我做什么,返回的子面板的大小总是错误大约4个像素.我只能在子面板右侧看到一个非常恼人的4像素间隙,使我的对话看起来很可怕.随着更多子面板的添加,效果明显增加.
我尝试使用什么来获得宽度:
sup-panel.getSize().width;
sub-panel.getBounds().width;
sub-panel.getWidth();
sub-panel.getPreferredSize().width;
Run Code Online (Sandbox Code Playgroud)
所有都返回相同的错误值.
我尝试过让其表现的其他事情:
parent.validate();
parent.repaint();
parent.doLayout();
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.这是故意的吗?我错过了尺寸背后的一些概念吗?它似乎是一致的,但如果我能在某处记录下来这将是很好的.
仅供参考:我使用的是java 1.3(支持遗留应用程序)
注意:这不是让窗口调整大小的问题,这部分发生得很好.并且子面板的大小似乎已正确设置,因为对其大小的更改将反映在为我的代码返回的值中.这些值总是略微偏离.
注意2:在父容器上调用pack()会使窗口看起来像我想要的那样,但它对我来说并不适用于所有场景,因为最终在存在足够的子面板之后需要存在滚动条.在这种情况下,pack()将简单地使我的对话框超宽,并使滚动条无用.
编辑:我已经解决了我的问题.相当令人尴尬的是,我所有的子面板都没有像它们应该的那样均匀的宽度.有两种解决方案可行.强制它们都是统一的,这可能很棘手,这取决于你对布局有多好.另一个是总结我希望看到的前n个面板的各个宽度.请注意,要使此解决方案有效,我必须为每个子组件的宽度添加额外的+1.不知道为什么,但我已经用各种边框和布局测试了它,它非常一致; 我想在某些地方可能还有一个额外空间的像素,我对此并不够思考.但重要的是它现在完美运作.这是一个数学样本(抱歉需要演员的旧学校无类型集合,Java 1.3):
int width = 0;
for(int i = 0; i < MAX_VISIBLE_PANELS; i++)
{
width += ((SubPanel)panelList.get(i)).getWidth();
width ++;//extra pixel per panel
}
Run Code Online (Sandbox Code Playgroud) 如何使用Swing将这些JComponents与"内容"窗格中心的"表单"对齐...
panel1.add(l1);
panel1.add(c1);
panel1.add(l2);
panel1.add(c2);
panel1.add(b4);
panel1.add(b5);
frame1.getContentPane().add(panel1);
Run Code Online (Sandbox Code Playgroud)
请帮我
我是布局经理的新手,比如Flow
,borders
......
我主要setBounds()
用来设置我的组件的位置.
我读了一篇文章,使用setBounds
是不是一个很好的做法,这是更好地使用一些布局.
哪些是最好和最常用的布局?
如何使用布局管理器定位按钮 ; 而不是做setbounds(10,10,100,30)
?
在java中,我一直在尝试创建一个可以接受带滚动条的其他面板的面板.
我尝试使用gridlayout,这很好用,除了我只添加几个面板的事实,它增长这些面板以适应父面板的大小.
我尝试使用flowlayout,但这会使面板水平流动,因为有一个滚动条.
我如何制作它以便我可以从顶部开始向父面板添加面板并使它们始终具有相同的尺寸(或它们的首选尺寸).
此外,当我在事件后向父面板添加面板时,直到我移动或调整窗体大小后才会显示它们.我怎么做它重绘?在它上面调用repaint()不起作用.
我正在制作这个程序以获得乐趣,我因为程序在屏幕上运行而卡住了.如何实现滚动条而不必完全更改我的代码.
public static void main(String args[]) throws IOException
{
String ai,ia,ny;
JTextField field1 = new JTextField();
JTextField field2 = new JTextField();
JTextField field3 = new JTextField();
JTextField field4 = new JTextField();
JTextField field5 = new JTextField();
JTextField field6 = new JTextField();
JTextField field7 = new JTextField();
JTextField field8 = new JTextField();
JTextField field9 = new JTextField();
JTextField field10 = new JTextField();
JTextField field11 = new JTextField();
JTextField field12 = new JTextField();
JTextField field13 = new JTextField();
JTextField field14 = new …
Run Code Online (Sandbox Code Playgroud) 正如标题所说,我正在努力做到.
我有一种有效的方法可以将几个相同的swing对象发布到一个帧中,方法是将它们存储在一个数组中并使用for循环添加它们,如下所示:
JLabel[] contrllabels= new JLabel[8];
contrllabels[0] = new JLabel("SCF Type: ");
contrllabels[1] = new JLabel("Units: ");
contrllabels[2] = new JLabel("Spherical Harmonics: ");
contrllabels[3] = new JLabel("Molecular Charge: ");
contrllabels[4] = new JLabel("PP: ");
contrllabels[5] = new JLabel("DFT Type: ");
contrllabels[6] = new JLabel("Max Iterations: ");
contrllabels[7] = new JLabel("Mult: ");
for(int i = 0;i<contrllabels.length;i++){
c.gridy = i;
frame.add(contrllabels[i],c);
}
Run Code Online (Sandbox Code Playgroud)
但是如果有几种不同类型的摆动物体呢?我有几个组合框和文本字段,我希望以类似的方式添加到框架中.我使用gridbaglayout所以如果我不使用for循环,我最终会得到很多不必要的代码,因为每次我想要添加不同的对象时都会给出约束新值.
是否有一个引用数组的东西指向这些不同的对象,然后我可以迭代通过添加到框架?就像是
JTextField tf = new JTextField(5);
JComboBox cb = new JComboBox("example");
Swing[] array = {tf,cb}
for(int i = 0;i<array.length;i++){ …
Run Code Online (Sandbox Code Playgroud) java ×11
swing ×11
jcomponent ×2
alignment ×1
arrays ×1
awt ×1
choice ×1
for-loop ×1
grouplayout ×1
joptionpane ×1
jscrollpane ×1
jtextarea ×1
layout ×1
object ×1
sizing ×1