标签: layout-manager

JScrollPane中的Java JPanel?

我有一个JFrame,在这个JFrame中我有一个我绘制的JPanel,这个面板可以是任何大小,所以我将它放入一个JScrollpane让我在面板大于窗口屏幕大小时滚动.

不幸的是,我的预期不起作用:

  1. 使JFrame窗口小于JPanel大小不会显示滚动条

  2. JScrollPane大小现在似乎锁定了我添加到它的JPanel的大小,之前它调整到它的JFrame窗口的边界(它仍然有点这样但现在只是垂直?!)

  3. 无论我为首选大小设置什么,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)

非常感谢

大卫

java swing jpanel jscrollpane layout-manager

16
推荐指数
2
解决办法
5万
查看次数

尺寸,仅更改宽度/高度

如何仅更改需要Dimension对象的组件的宽度或高度?目前我这样做:

jbutton.setPreferredSize(new Dimension(button.getPreferredSize().width, 100));
Run Code Online (Sandbox Code Playgroud)

但我觉得我做错了.如果有更好的方法,最好的方法是什么?

java swing layout-manager dimension

15
推荐指数
2
解决办法
1万
查看次数

使用重写getPreferredSize()而不是对固定大小的组件使用setPreferredSize()

我在这里读了一些帖子,我开始为什么有些人这样做

@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对象,而第一个可能创建几个(即使它没有那么多浪费的内存)?还是我错了?有什么不同吗?

java swing layout-manager

15
推荐指数
1
解决办法
1万
查看次数

CardLayout与手动添加/删除JPanels有什么特别之处?

在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即使大多数永远不会被使用?

java swing jpanel layout-manager cardlayout

14
推荐指数
2
解决办法
1408
查看次数

具有多个行和列的Recycler视图 - AutoFit,如Flow Layout [Android]

我正在构建一个像这样的布局的挑战:

在此输入图像描述

我的第一个见解是使用带有适配器的RecyclerView,该适配器可以处理每个项目并使其布局膨胀.

到目前为止,还不是那么好.

到目前为止我有这个布局:

在此输入图像描述

我可以感觉到我几乎就在那里,但是真的......我花了一个星期思考如何让它变得更好,或者就像UI提出的那样.

我的一些尝试是

  1. 使用网格布局并根据列表中的项目数更改最大列数
  2. StaggeredGridLayoutManager听起来像是一个强大的候选者来修复它并让我开心,但不幸的是,当我尝试使用它时,我意识到我们需要在构造函数上传递一些spanCount(列),我找到了一些方法来解决这个限制,改变了每行的列数,但我不喜欢最终结果,不像我在Foursquare等其他应用中看到的那样设置您的兴趣.
  3. 我查看了这个库Flow Layout,但我甚至没有开始使用它,因为我不想失去整个回收器的视图功能,我相信有一种方法可以使它工作!.....即使知道图书馆完全符合我的需要.

伙计们,我不是在这里寻找一些已经完成的代码安静或者有人来完成我的工作.其实我正在寻找隧道尽头的灯光.

android layout-manager flowlayout gridlayoutmanager android-recyclerview

14
推荐指数
1
解决办法
8302
查看次数

为什么在Swing中使用null布局不赞成?

最近,我开始为我工作的公司创建一个程序.就像背景信息一样,我仍然是学生和初学者程序员,所以我的解决方案可能不推荐,我不知道如何做到这一点,但它有效,我不会因为它而受到评判,因为这是一项完全与编程无关的学生作业.

关于该程序的事情是,它将在具有不同屏幕尺寸和分辨率(800x600及以上)的多台不同计算机上运行.为了确保尽可能多地占用屏幕而不丢失程序的任何部分,我将布局设置为null并使用相对值对所有内容进行硬编码.

程序是自助终端风格,我首先得到屏幕尺寸值并从那里开始(例如,从我的头顶,左侧菜单占据屏幕的八分之一,顶部栏2%,等等) .我还使用字体度量来确保组件的大小正确并且所有内容都能很好地显示.

我的问题是:为什么让布局为null而不是使用布局管理器是如此不满?(我在一些论坛上被告知这是一种可怕的做事方式)我知道布局管理器如何工作并知道如何使用不同的布局,但是对于这个程序的要求(多种不同的分辨率,自定义按钮形状和放置) ,当您更改语言时,文本在组件上发生变化等等),我无法看到自己使用布局管理器来完成所有操作.

在这种情况下,你如何让更有经验的程序员使用布局管理器?当你想要一个特定的按钮和其他特定的其他组件并不真正匹配任何预定义的布局时,你会怎么做?

java layout swing layout-manager null-layout-manager

13
推荐指数
2
解决办法
2625
查看次数

java.awt.AWTError:无法共享BoxLayout

我在设置布局之前初始化了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)

java swing layout-manager

12
推荐指数
2
解决办法
2万
查看次数

java BoxLayout面板的对齐方式

我浏览过,并没有找到专门针对我的情况定制的解决方案.我有一个面板,我在对话框中显示:

//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任何帮助或建议.

java user-interface swing layout-manager boxlayout

12
推荐指数
3
解决办法
7万
查看次数

GroupLayout一次只能与一个容器一起使用

不确定为什么会出现这个错误.我正在使用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)

java swing exception layout-manager grouplayout

12
推荐指数
1
解决办法
1万
查看次数

如何在另一个JPanel中将JPanel扩展到最大宽度

我觉得我需要稍微改一下这个问题.

更新了以下问题.

我有一个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)

但是所有面板的尺寸都相同,忽略了限制.

java swing jpanel layout-manager boxlayout

12
推荐指数
2
解决办法
4万
查看次数