2016-02-10 42 views
1

我想创建一个使用Java Swing(GridBagLayout)的控制台。设置GridBagLayout网格的大小

我不知道为什么,但正如你可以在左边看到的那样,网格没有正确的大小。

The code output

这应该显示是这样的: enter image description here

凡淡蓝色的列表,绿色的形象,橙色文本面板和黄色的文本字段。

我不知道如何让列表变大,图像变小。此外,文本字段的网格绑定到列表1,即使严格的列表在y 1和文本字段在y 2上。

下面是一些代码。

// Command List 
DefaultListModel<String> listInput = new DefaultListModel<String>(); 
JList<String> list = new JList<String>(listInput); 
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
JScrollPane scrollPane = new JScrollPane(list); 
list.setBackground(new Color(160, 160, 160)); 
list.setSelectionBackground(new Color(150, 150, 150)); 
scrollPane.setPreferredSize(new Dimension(20, 20)); 
manager.setCommandList(listInput); 

    c.insets = new Insets(2, 2, 2, 2); 
    c.ipady = 0; 
    c.ipadx = 100; 
    c.gridx = 0; 
    c.gridy = 1; 
    c.gridwidth = 1; 
    c.gridheight = 2; 
    c.weightx = 0.1; 
    c.weighty = 0.6; 
    c.fill = GridBagConstraints.BOTH; 
console.add(scrollPane, c); 

// Image Displayer 
JLabel image = new JLabel(new ImageIcon()); 
manager.setImageField(image); 

    c.insets = new Insets(0, 0, 0, 0); 
    c.ipady = 0; 
    c.ipadx = 0; 
    c.gridx = 0; 
    c.gridy = 0; 
    c.gridwidth = 1; 
    c.gridheight = 1; 
    c.weightx = 0.1; 
    c.weighty = 0.3; 
    c.fill = GridBagConstraints.BOTH; 
console.add(image, c); 

其中'c'是一个网格袋约束和控制主JPanel。 正如你所看到的,列表的网格高度为2,重量为0.6,图像的网格高度为1,重量为0.9,因此不确定列表为什么比图像小4倍。

另一个问题,我添加了一个监听器来保存图像(调整大小),反正,它不被调用。我应该将侦听器添加到主面板吗?因为图片只是由布局经理调整大小。

谢谢^^

编辑: SSCCE:

package co.relieved.jelly.application.display.swing; 

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.Insets; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.DefaultListModel; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTabbedPane; 
import javax.swing.JTextField; 
import javax.swing.JTextPane; 
import javax.swing.ListSelectionModel; 

@SuppressWarnings("serial") 
public class Test extends JPanel { 

    static JLabel image; 

    public static void main(String[] args) { 
     display(); 
     try { 
      BufferedImage buffer = ImageIO 
       .read(new File("/home/juanco/Pictures/Screenshot from 2016-02-08 22-43-22.png")); 
      image.setIcon(new ImageIcon(
       buffer.getScaledInstance(image.getWidth(), image.getHeight(), BufferedImage.SCALE_SMOOTH))); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public Test() { 
     super(new GridLayout(1, 1)); 
     JTabbedPane tabs = new JTabbedPane(); 

     /*** >>> Console Pane <<< ***/ 
     JPanel console = new JPanel(); 
     console.setLayout(new GridBagLayout()); 
     GridBagConstraints c = new GridBagConstraints(); 

     c.ipadx = 0; 
     c.ipady = 0; 
     c.gridwidth = 1; 
     c.anchor = GridBagConstraints.CENTER; 
     c.fill = GridBagConstraints.BOTH; 

     // Console Screen 
     JTextPane screen = new JTextPane(); 
     screen.setEditable(false); 

     c.gridx = 1; 
     c.gridy = 0; 
     c.gridheight = 2; 
     c.weightx = 0.8; 
     c.weighty = 1; 
     console.add(screen, c); 

     // Console Input 
     JTextField input = new JTextField(); 

     c.insets = new Insets(2, 0, 2, 0); 
     c.ipady = 3; 
     c.gridy = 2; 
     c.gridheight = 1; 
     c.weighty = 0; 
     c.fill = GridBagConstraints.HORIZONTAL; 
     console.add(input, c); 

     // Command List 
     DefaultListModel<String> listInput = new DefaultListModel<String>(); 
     listInput.setSize(1); 
     JList<String> list = new JList<String>(listInput); 
     list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     JScrollPane scrollPane = new JScrollPane(list); 

     c.insets = new Insets(2, 2, 2, 2); 
     c.ipady = 0; 
     c.ipadx = 100; 
     c.gridx = 0; 
     c.gridy = 1; 
     c.gridheight = 2; 
     c.weightx = 0.1; 
     c.weighty = 0.6; 
     c.fill = GridBagConstraints.BOTH; 
     console.add(scrollPane, c); 

     // Image Displayer 
     image = new JLabel(new ImageIcon()); 

     c.insets = new Insets(0, 0, 0, 0); 
     c.ipadx = 0; 
     c.gridy = 0; 
     c.gridheight = 1; 
     c.weighty = 0.3; 
     console.add(image, c); 

     // General 
     tabs.addTab("Console", console); 

     /*** >>> Logs Pane <<< ***/ 
     JPanel logs = new JPanel(); 

     tabs.addTab("Logs", logs); 

     // Setup 
     tabs.setSelectedIndex(0); 
     add(tabs); 
    } 

    static void display() { 
     JFrame frame = new JFrame("Relieved Console"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.setPreferredSize(new Dimension(800, 500)); 
     frame.add(new Test(), BorderLayout.CENTER); 

     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+1

'完整代码:' - 不是它的完整代码。发布的代码不能编译。无论如何,我们不希望您的应用程序的完整代码。我们需要一个证明问题的[SSCCE](http://sscce.org/)。这是创建一个框架和4个组件的简单类。尝试在你想要的布局中添加4个组件。选项卡式窗格和所有其他代码与仅尝试在框架上布置组件的问题无关。一旦你得到SSCCE的工作,然后你修复你的真实代码。 – camickr

+0

那样?我删除了所有不必要的代码,它将打印没有颜色/格式的相同输出 – Juanco

+0

'我删除了所有不必要的代码' - 不是真的。你的问题是关于组件的高度。所有与填充或插入相关的代码与获取高度占据两个网格无关。此外,图像是无关紧要的。所有你需要的是带有文本的标签来模拟单元中的组件。另外,我建议你在逻辑上重新排列你的代码,使其更具可读性。人们从左到右和从上到下设计网格。因此,您应该为单元格y = 0,x = 0/1然后y = 1,x = 0/1创建组件,以便一次构建网格一行。 – camickr

回答

4

这是一些代码。

这没有帮助。网格只能用整个代码完成。这就是我们需要知道所有组件的网格宽度和网格高度,以便确定网格中每个组件的空间分配。

文本字段的网格绑定到列表中的一个,甚至强硬的名单是Y 1和文本字段Y上2

你不能只是随机的成分分配给格。如果组件上方的组件的网格高度为2,那么该组件只会进入网格2.因此,基本上每个列都需要具有网格总高度为3的组件。

我不知道如何使列表更大

设置(20,20)优选的大小没有帮助。无论如何,你不应该使用setPreferredSize()方法。

相反,你应该使用:

list.setVisibleRowCount(...); 

指定可见行。然后JList可以确定它自己的首选大小。

另一个布局选项是使用可以简化布局的嵌套面板。

所以你可以从使用BorderLayout的“west”面板开始。然后,将标签添加到“PAGE_START”,将列表添加到“CENTER”。

然后你创建一个“中心”面板。将主要组件添加到“CENTER”,将文本字段添加到“PAGE_START”。

然后你两个面板添加到框架:

frame.add(westPanel, BorderLayout.LINE_START); 
frame.add(centerPanel, BorderLayout.CENTER); 

编辑:

对不起,我收回我的评论有关使每列有3网格高度,你不能只是指定总的网格高度为3,因为每列只有2个组件,所以每个组件只能有1的高度。

查看我在本贴中的回答:Why does this GridBagLayout not appear as planned?对于黑客来说,允许您操纵gridHeight /使用invisib的重量一行/一列中的组件。

但是,我不推荐这种方法。使用BorderLayout(或嵌套面板上的某个其他布局管理器)使用我的嵌套面板建议会容易得多。

+0

嗨,对于迟到的回复感到抱歉。 设置首选大小的方法只是为jlabel添加一个值,如果jlabel为空,网格将会扩展更多 要添加完整的代码。无论如何,每个柱子的网格总高度为3 – Juanco

+0

@Juanco - 您正在设置滚动窗格的首选大小。不要这样做。我告诉过你建议JList大小的正确方法。 – camickr

+0

@Juanco,见编辑。 – camickr

0

在我看来,你将还需要指定文本字段的gridwidth和/或gridheight为好。

GridBagLayout就像一个光荣的GridLayout。它会尝试将所有组件与其周围最近的网格空间对齐。 Oracle's Tutorials也描述了这种行为。

大部分时间,使用GridBagLayout来布局组件的问题都来自于将其他组件添加到布局而不是显而易见的问题子组件。

+0

网格宽度和网格高度已经被指定。 – Juanco

0

我修正了它将“控制台”JPanel分成两部分,左边的边界布局面板和右边的网格布局面板。正如@camickr建议的