我有一个JFrame,在这个JFrame中我有一个我绘制的JPanel,这个面板可以是任何大小,所以我将它放入一个JScrollpane让我在面板大于窗口屏幕大小时滚动.
不幸的是,我的预期不起作用:
使JFrame窗口小于JPanel大小不会显示滚动条
JScrollPane大小现在似乎锁定了我添加到它的JPanel的大小,之前它调整到它的JFrame窗口的边界(它仍然有点这样但现在只是垂直?!)
无论我为首选大小设置什么,JPanel似乎都假设JScrollpane的大小
我确信我做的事情很愚蠢,如果有人能指出我会非常感激的话!
JPanel _ImageCanvas = new JPanel(); // 'Canvas' to draw on
JScrollPane _ScrollPane = new JScrollPane();
// set size of 'canvas'
_ImageCanvas.setMinimumSize(new Dimension(100,100));
// Scroll pane smaller then the size of the canvas so we should get scroll bars right?
_ScrollPane.setMinimumSize(new Dimension(50,50));
// Add a border to 'canvas'
_ImageCanvas.setBorder(BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
_ScrollPane.setViewportView(JPanel);
Run Code Online (Sandbox Code Playgroud)
非常感谢
大卫
如何仅更改需要Dimension对象的组件的宽度或高度?目前我这样做:
jbutton.setPreferredSize(new Dimension(button.getPreferredSize().width, 100));
Run Code Online (Sandbox Code Playgroud)
但我觉得我做错了.如果有更好的方法,最好的方法是什么?
我在这里读了一些帖子,我开始为什么有些人这样做
@Override
public Dimension getPreferredSize() {
return new Dimension(500, 500);
}
Run Code Online (Sandbox Code Playgroud)
代替
setPreferredSize(new Dimension(500, 500));
Run Code Online (Sandbox Code Playgroud)
不是第二个更好,因为它只创建一个Dimension对象,而第一个可能创建几个(即使它没有那么多浪费的内存)?还是我错了?有什么不同吗?
在StackOverflow上有很多次用户问这样的问题......
我有一个
JPanel包含孩子的主人JPanel.当用户单击按钮时,孩子JPanel应该更改为其他JPanel.我怎样才能做到这一点.
通常,用户实际上已尝试实现此问题,但无法使其正常工作.
每当我回答这个问题时,我都会告诉他们做这样的事情(简单地说)......
JPanel myFrame = new JPanel();
myFrame.remove(oldPanel);
myFrame.add(newPanel);
Run Code Online (Sandbox Code Playgroud)
我认为这是一个非常合理的答案,我个人在我自己的许多Java项目中都没有使用过这个问题.但是,我总是得到我的回答,每个人只是说"使用CardLayout".
所以我的问题是,为什么每个人都如此着迷CardLayout,以至于我的答案值得进行投票?为什么我应该CardLayout使用上面的代码选择使用而不是添加/删除面板?
作为进一步的问题,您是否仍然建议CardLayout使用具有动态JPanel的接口.例如,我的大多数程序都实现了一个自定义插件框架,其中可能有数百个JPanels,但我只是加载并显示实际需要的面板.对于程序的正常使用,大多数面板实际上永远不会被加载或需要.对于这种类型的场景,我的编码方法是否是最好的解决方案,据我所知,这CardLayout将需要我实际创建所有的,JPanels即使大多数永远不会被使用?
我正在构建一个像这样的布局的挑战:
我的第一个见解是使用带有适配器的RecyclerView,该适配器可以处理每个项目并使其布局膨胀.
到目前为止,还不是那么好.
到目前为止我有这个布局:
我可以感觉到我几乎就在那里,但是真的......我花了一个星期思考如何让它变得更好,或者就像UI提出的那样.
我的一些尝试是
伙计们,我不是在这里寻找一些已经完成的代码安静或者有人来完成我的工作.其实我正在寻找隧道尽头的灯光.
android layout-manager flowlayout gridlayoutmanager android-recyclerview
最近,我开始为我工作的公司创建一个程序.就像背景信息一样,我仍然是学生和初学者程序员,所以我的解决方案可能不推荐,我不知道如何做到这一点,但它有效,我不会因为它而受到评判,因为这是一项完全与编程无关的学生作业.
关于该程序的事情是,它将在具有不同屏幕尺寸和分辨率(800x600及以上)的多台不同计算机上运行.为了确保尽可能多地占用屏幕而不丢失程序的任何部分,我将布局设置为null并使用相对值对所有内容进行硬编码.
程序是自助终端风格,我首先得到屏幕尺寸值并从那里开始(例如,从我的头顶,左侧菜单占据屏幕的八分之一,顶部栏2%,等等) .我还使用字体度量来确保组件的大小正确并且所有内容都能很好地显示.
我的问题是:为什么让布局为null而不是使用布局管理器是如此不满?(我在一些论坛上被告知这是一种可怕的做事方式)我知道布局管理器如何工作并知道如何使用不同的布局,但是对于这个程序的要求(多种不同的分辨率,自定义按钮形状和放置) ,当您更改语言时,文本在组件上发生变化等等),我无法看到自己使用布局管理器来完成所有操作.
在这种情况下,你如何让更有经验的程序员使用布局管理器?当你想要一个特定的按钮和其他特定的其他组件并不真正匹配任何预定义的布局时,你会怎么做?
我在设置布局之前初始化了MotePanel,Command Panel和LEDPanel,那么我是如何得到这个例外的.
请帮忙.
Exception in thread "main" java.awt.AWTError: BoxLayout can't be shared
at javax.swing.BoxLayout.checkContainer(BoxLayout.java:462)
at javax.swing.BoxLayout.invalidateLayout(BoxLayout.java:246)
at javax.swing.BoxLayout.addLayoutComponent(BoxLayout.java:279)
at java.awt.Container.addImpl(Container.java:1107)
at java.awt.Container.add(Container.java:974)
at javax.swing.JFrame.addImpl(JFrame.java:556)
at java.awt.Container.add(Container.java:377)
at Window.<init>(Window.java:54)
Run Code Online (Sandbox Code Playgroud)
public class Window extends JFrame{
private JPanel MotePanel;
private JPanel LEDPanel;
private JPanel CommandPanel;
private JCheckBox motes[];
private JRadioButton Leds[];
public Window(){
this.setLayout(new BoxLayout(this,BoxLayout.X_AXIS));
this.setTitle("Sensor Networks Lab");
this.setSize(300, 200);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
MotePanel = new JPanel();
LEDPanel = new JPanel();
CommandPanel = new JPanel();
motes = new JCheckBox[10];
Leds = new JRadioButton[3];
MotePanel.setLayout(new …Run Code Online (Sandbox Code Playgroud) 我浏览过,并没有找到专门针对我的情况定制的解决方案.我有一个面板,我在对话框中显示:
//create dialog panel
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(headerPanel);
panel.add(type1Panel);
panel.add(type2Panel);
panel.add(type3Panel);
panel.add(type4Panel);
panel.add(type5Panel);
panel.add(type6Panel);
int result = JOptionPane.showConfirmDialog(null, panel, "Please enter values.", JOptionPane.OK_CANCEL_OPTION);
Run Code Online (Sandbox Code Playgroud)
最后两个面板的大小,类型5和类型6,大小相同,所以它们看起来很好.但是,标题和前4个面板的大小不同,我希望它们全部左对齐.到目前为止,我还没有找到一个很好的解决方案,如何解决这个问题.
问题是,我怎么能保持对齐前5个面板,而不是最后2个?如果不是,我怎么能将它们全部对齐?setalignmentx()不适用于面板.我已经使用网格布局尝试过,但随后的GUI的主窗口的宽度相当大,不能很好地适应屏幕,因此BoxLayout的沿Ÿaxis.Thanks任何帮助或建议.
不确定为什么会出现这个错误.我正在使用GroupLayout,因为我希望它为我做间距,并将在未来向框架添加更多面板.下面是堆栈跟踪.
Exception in thread "main" java.lang.IllegalArgumentException: GroupLayout can only be used with one Container at a time
at javax.swing.GroupLayout.checkParent(Unknown Source)
at javax.swing.GroupLayout.invalidateLayout(Unknown Source)
at java.awt.Container.invalidate(Unknown Source)
at java.awt.Component.addNotify(Unknown Source)
at java.awt.Container.addNotify(Unknown Source)
at javax.swing.JComponent.addNotify(Unknown Source)
at java.awt.Container.addNotify(Unknown Source)
at javax.swing.JComponent.addNotify(Unknown Source)
at java.awt.Container.addNotify(Unknown Source)
at javax.swing.JComponent.addNotify(Unknown Source)
at javax.swing.JRootPane.addNotify(Unknown Source)
at java.awt.Container.addNotify(Unknown Source)
at java.awt.Window.addNotify(Unknown Source)
at java.awt.Frame.addNotify(Unknown Source)
at java.awt.Window.pack(Unknown Source)
at client.AlternateGUI.drawGui(AlternateGUI.java:54)
at client.AlternateGUI.main(AlternateGUI.java:24)
Run Code Online (Sandbox Code Playgroud)
这是代码:
package client;
import java.awt.Component;*
public class AlternateGUI {
private JList people;
private DefaultListModel …Run Code Online (Sandbox Code Playgroud) 我觉得我需要稍微改一下这个问题.
更新了以下问题.
我有一个JPanel包含:
myjpanel.setLayout(new BoxLayout(selectors, BoxLayout.PAGE_AXIS));
Run Code Online (Sandbox Code Playgroud)
它包含以下三个面板:
固定大小为'x'和'y'的JPanel
JPanel没有固定的大小
JPanel没有固定的尺寸和小的高度
第二个JPanel包含一个JTable,因此它会扩展以填充整个高度,并按预期方式将底部面板完全按下.
像这样:
t
t
m
m
m
m
m
b
Run Code Online (Sandbox Code Playgroud)
t =顶部面板,m =中间面板,b =底部面板.
这样可行.但是底部面板不像填充父级的整个宽度那样是一个问题.
ttt
mmm
b
Run Code Online (Sandbox Code Playgroud)
我想要这个,面板填充整个宽度:
ttt
mmm
bbb
Run Code Online (Sandbox Code Playgroud)
或者,底部面板保持居中的位置:
ttt
mmm
b
Run Code Online (Sandbox Code Playgroud)
老问题如下:
我有一个JPanel包含:
.setLayout(new BoxLayout(selectors, BoxLayout.PAGE_AXIS));
Run Code Online (Sandbox Code Playgroud)
在其中,还有三个JPanels.前两个是固定大小而中间一个不是.
我希望我的底部面板只占用它所需的高度,但使用外部JPanel的所有可用宽度.
我尝试过使用胶水,但无济于事,我宁愿不设置首选和最小/最大尺寸.有没有办法告诉组件只使用布局管理器和框架"填充整个父级宽度".我宁愿不开始做像设置大小和重写方法的黑客.
注意:我不能在内部面板中放置任何胶水或填充物,只能修改外部面板及其布局管理器.
尝试1:
使用myPanel.setLayout(new GridLayout(3, 1));没有产生预期的结果.它做了一个像这样的网格:
XX
X
Run Code Online (Sandbox Code Playgroud)
但我预计:
X
X
X
Run Code Online (Sandbox Code Playgroud)
尝试2:
使用myPanel.setLayout(new GridLayout(0,1));没有产生预期的结果.它做了一个像这样的网格:
x
x
x
Run Code Online (Sandbox Code Playgroud)
但是所有面板的尺寸都相同,忽略了限制.
layout-manager ×10
java ×9
swing ×9
jpanel ×3
boxlayout ×2
android ×1
cardlayout ×1
dimension ×1
exception ×1
flowlayout ×1
grouplayout ×1
jscrollpane ×1
layout ×1