对于带有图标的JLabel,如果setHorizontalTextPosition(SwingConstants.LEADING)是,则无论标签有多宽,都会在文本后面立即绘制图标.
这对于列表来说尤其糟糕,因为图标将遍布整个地方,具体取决于每个项目的文本长度.
我跟踪代码,似乎是SwingUtilities#layoutCompoundLabelImpl,文本宽度只是设置为SwingUtilities2.stringWidth(c, fm, text),而图标x设置为跟随文本而不考虑标签宽度.
这是最简单的情况:
import java.awt.*;
import javax.swing.*;
public class TestJLabelIcon
{
public static void main(String args[])
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JLabel c = new JLabel("abc");
c.setHorizontalTextPosition(SwingConstants.LEADING);
c.setHorizontalAlignment(SwingConstants.LEADING);
c.setIcon(UIManager.getIcon("FileChooser.detailsViewIcon"));
c.setBorder(BorderFactory.createLineBorder(Color.RED));
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.getContentPane().add(c);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
您可以看到标签始终填充框架但图标保持不变.如果将两个参数都设置为,则会出现镜像问题TRAILING.
我知道我可以覆盖UI,或使用JPanel等.我只是想知道我是否在JLabel中遗漏了一些简单的东西.如果没有,它似乎是一个Java bug.
仅供参考,这是Windows XP上的jdk1.6.0_06.
所以我想编写一个矩阵浏览器,它可以让我重新排序矩阵的行和列.对于这个porpouse,我使用了Jtable类.现在我遇到的问题是,通过查看双值来重新排序矩阵是非常困难的,所以我想打印矩阵而不是双值,而是用圆圈表示圆的半径代表值.这样我就能更快地分辨出大值和小值之间的区别.
任何人都知道我怎么能用JTable或任何表类将这个双值转换成实心圆?
是否有任何干净的方法允许用户选择JTable的多个非连续单元格?或者我被迫实现自己的ListSelectionModel?
我在JTable上使用setCellSelectionEnabled()和setSelectionModel()方法,但我只能选择连续单元组.
编辑:
我试过@mKorbel不错的SSCCE.它适用于列表,但似乎没有完全在表上工作.这是一个SSCCE:
import java.awt.Component;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class TableSelection extends JFrame{
String[] columnNames = {"First Name",
"Last Name",
"Sport",
"# of Years",
"Vegetarian"};
Object[][] data = {
{"Kathy", "Smith",
"Snowboarding", new Integer(5), new Boolean(false)},
{"John", "Doe",
"Rowing", new Integer(3), new Boolean(true)},
{"Sue", "Black",
"Knitting", new Integer(2), new Boolean(false)},
{"Jane", "White",
"Speed reading", new Integer(20), new Boolean(true)},
{"Joe", "Brown",
"Pool", new Integer(10), new Boolean(false)}
};
public TableSelection(){
JPanel main= …Run Code Online (Sandbox Code Playgroud)