如何均匀化 JTable 中的组件大小?
How to homogenize components size in a JTable?
我有一个包含两列的 JTable。第一个包含一个自定义组件(条形图),其中包含三个组件:JLabel lMinLabel、Graph lGraph 和 JLabel lMaxLabel。这是我所拥有的:
这是我想要的:
值标签在不同的行中可以有不同的大小,这会修改条形图的大小。我希望条形图对所有 JTable 行具有相同的大小。
我尝试将标签放在面板中,并为这些面板设置了最小尺寸(具有固定值)。
这是我的代码:
package test;
import java.awt.Component;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class JTableExample extends JFrame {
public JTableExample() {
super("JTable Example");
DefaultTableModel dm = new DefaultTableModel();
dm.setDataVector(new Object[][] { { new BarGraph(0, 10, 25, 27, 75, 90,100), "foo" },
{ new BarGraph(100, 1000, 2500, 5600, 7500, 9000,10000), "bar" } },
new Object[] { "Graph", "String" });
JTable table = new JTable(dm);
table.getColumn("Graph").setCellRenderer(new Renderer());
JScrollPane scroll = new JScrollPane(table);
getContentPane().add(scroll);
setSize(800, 100);
setVisible(true);
}
public static void main(String[] args) {
JTableExample frame = new JTableExample();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
class Renderer implements TableCellRenderer {
public Renderer() {}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
return (Component) value;
}
}
我尝试设置标准尺寸的条形图class:
package test;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class BarGraph extends JComponent {
private final double preWarningMax;
private final double preWarningMin;
private final double valueMax;
private final double valueMin;
private final double warningMax;
private final double warningMin;
private double value;
public BarGraph(double pValueMin, double pWarningMin, double pPreWarningMin, double pValue, double pPreWarningMax,
double pWarningMax, double pValueMax) {
super();
valueMin = pValueMin;
warningMin = pWarningMin;
preWarningMin = pPreWarningMin;
value = pValue;
preWarningMax = pPreWarningMin;
warningMax = pWarningMax;
valueMax = pValueMax;
this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
JPanel lMinPanel = new JPanel();
JLabel lMinValue = new JLabel(Double.toString(valueMin));
lMinPanel.add(lMinValue);
Graph lGraph = new Graph();
JPanel lMaxPanel = new JPanel();
JLabel lMaxValue = new JLabel(Double.toString(valueMax));
lMaxPanel.add(lMaxValue);
add(lMinPanel);
add(lGraph);
add(lMaxPanel);
lMinPanel.setMinimumSize(new Dimension(15, 5));
lMaxPanel.setMinimumSize(new Dimension(15, 5));
}
private class Graph extends JComponent {
@Override
protected void paintComponent(Graphics pGraphics) {
...
}
}
}
使 JTable 行之间的条形图大小均匀化的最佳方法是什么?
JPanel lMinPanel = new JPanel();
JLabel lMinValue = new JLabel(Double.toString(valueMin));
lMinPanel.add(lMinValue);
为什么要创建一个额外的面板来容纳每个 JLabel?
注意文本是如何位于单元格顶部下方的。这是因为面板的默认 FlowLayout 在面板的所有边缘周围添加了 5 个像素。
摆脱面板,只需将 JLabel 直接添加到带有 BoxLayout 的面板。
The bargraph class where I try to set the standard size:
lMinPanel.setMinimumSize(new Dimension(15, 5));
lMaxPanel.setMinimumSize(new Dimension(15, 5));
问题是 BoxLayout
尊重 "maximum" 尺寸。因此所有组件都将增长以填充 space 可用空间。
相反,我认为您想设置最大尺寸。所以使用我的第一个建议,基本代码应该是这样的:
lMinValue.setMaximumSize( new Dimension(50, lminValue.getPreferredSize().height) );
您还可以为 lMaxValue 设置此项。
然后将 lMinValue/lMaxValue 添加到组件中。
您将单独保留图表面板的最大尺寸,因此在将 100 个像素分配给两个标签后,它应该会增长以占用所有 space。
请注意,这假设条形图的最大尺寸大于其首选尺寸。
我有一个包含两列的 JTable。第一个包含一个自定义组件(条形图),其中包含三个组件:JLabel lMinLabel、Graph lGraph 和 JLabel lMaxLabel。这是我所拥有的:
这是我想要的:
值标签在不同的行中可以有不同的大小,这会修改条形图的大小。我希望条形图对所有 JTable 行具有相同的大小。
我尝试将标签放在面板中,并为这些面板设置了最小尺寸(具有固定值)。
这是我的代码:
package test;
import java.awt.Component;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class JTableExample extends JFrame {
public JTableExample() {
super("JTable Example");
DefaultTableModel dm = new DefaultTableModel();
dm.setDataVector(new Object[][] { { new BarGraph(0, 10, 25, 27, 75, 90,100), "foo" },
{ new BarGraph(100, 1000, 2500, 5600, 7500, 9000,10000), "bar" } },
new Object[] { "Graph", "String" });
JTable table = new JTable(dm);
table.getColumn("Graph").setCellRenderer(new Renderer());
JScrollPane scroll = new JScrollPane(table);
getContentPane().add(scroll);
setSize(800, 100);
setVisible(true);
}
public static void main(String[] args) {
JTableExample frame = new JTableExample();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
class Renderer implements TableCellRenderer {
public Renderer() {}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
return (Component) value;
}
}
我尝试设置标准尺寸的条形图class:
package test;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class BarGraph extends JComponent {
private final double preWarningMax;
private final double preWarningMin;
private final double valueMax;
private final double valueMin;
private final double warningMax;
private final double warningMin;
private double value;
public BarGraph(double pValueMin, double pWarningMin, double pPreWarningMin, double pValue, double pPreWarningMax,
double pWarningMax, double pValueMax) {
super();
valueMin = pValueMin;
warningMin = pWarningMin;
preWarningMin = pPreWarningMin;
value = pValue;
preWarningMax = pPreWarningMin;
warningMax = pWarningMax;
valueMax = pValueMax;
this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
JPanel lMinPanel = new JPanel();
JLabel lMinValue = new JLabel(Double.toString(valueMin));
lMinPanel.add(lMinValue);
Graph lGraph = new Graph();
JPanel lMaxPanel = new JPanel();
JLabel lMaxValue = new JLabel(Double.toString(valueMax));
lMaxPanel.add(lMaxValue);
add(lMinPanel);
add(lGraph);
add(lMaxPanel);
lMinPanel.setMinimumSize(new Dimension(15, 5));
lMaxPanel.setMinimumSize(new Dimension(15, 5));
}
private class Graph extends JComponent {
@Override
protected void paintComponent(Graphics pGraphics) {
...
}
}
}
使 JTable 行之间的条形图大小均匀化的最佳方法是什么?
JPanel lMinPanel = new JPanel();
JLabel lMinValue = new JLabel(Double.toString(valueMin));
lMinPanel.add(lMinValue);
为什么要创建一个额外的面板来容纳每个 JLabel?
注意文本是如何位于单元格顶部下方的。这是因为面板的默认 FlowLayout 在面板的所有边缘周围添加了 5 个像素。
摆脱面板,只需将 JLabel 直接添加到带有 BoxLayout 的面板。
The bargraph class where I try to set the standard size:
lMinPanel.setMinimumSize(new Dimension(15, 5));
lMaxPanel.setMinimumSize(new Dimension(15, 5));
问题是 BoxLayout
尊重 "maximum" 尺寸。因此所有组件都将增长以填充 space 可用空间。
相反,我认为您想设置最大尺寸。所以使用我的第一个建议,基本代码应该是这样的:
lMinValue.setMaximumSize( new Dimension(50, lminValue.getPreferredSize().height) );
您还可以为 lMaxValue 设置此项。
然后将 lMinValue/lMaxValue 添加到组件中。
您将单独保留图表面板的最大尺寸,因此在将 100 个像素分配给两个标签后,它应该会增长以占用所有 space。
请注意,这假设条形图的最大尺寸大于其首选尺寸。