Как я могу установить фон и границу JLabel так же, как заголовок таблицы?
Я хочу воссоздать заголовок таблицы, используя JLabel
, Внешний вид JLabel
должен быть в точности как JTableHeader
будет, указано системой.
Это то, что я пробовал до сих пор:
JLabel header = new JLabel("Title");
header.setOpaque(true);
header.setBackground(UIManager.getColor(new JTableHeader().getBackground()));
header.setBorder(UIManager.getBorder(new JTableHeader().getBorder()));
Но UIManager
возвращается null
для цвета и границы.
Есть идеи?
Вот как я настраиваю внешний вид:
javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
4 ответа
Есть больше проблем, чем получение цвета и границы заголовка таблицы. Каждая ячейка / столбец отображается TableCellRenderer
Это означает, что значения возвращаются UIManager
может быть проигнорировано...
Например, следующее делает JTableHeader
и применяет границу / фон к JLabel
на основе значений, возвращаемых UIManager
под окном смотри и чувствуй...
Как видите, между ними есть большая разница
Однако, если все, что вас интересует, - это отображение какого-либо "группового заголовка" поверх другого компонента на панели прокрутки, вы можете просто добавить JTableHeader
к представлению столбца областей прокрутки непосредственно...
public class TestHeader {
public static void main(String[] args) {
new TestHeader();
}
public TestHeader() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
TableColumnModel model = new DefaultTableColumnModel();
final TableColumn column = new TableColumn(0, 250);
column.setHeaderValue("Test");
model.addColumn(column);
JTableHeader header = new JTableHeader();
header.setColumnModel(model);
final JTextArea textArea = new JTextArea();
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setColumnHeaderView(header);
textArea.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
column.setWidth(textArea.getWidth());
}
});
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(scrollPane);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
ОБНОВЛЕНО
public class TestHeader {
public static void main(String[] args) {
new TestHeader();
}
public TestHeader() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
TableColumnModel model = new DefaultTableColumnModel();
final TableColumn column = new TableColumn(0, 250);
column.setHeaderValue("I don't see the problem");
model.addColumn(column);
final JTableHeader header = new JTableHeader();
header.setColumnModel(model);
DefaultTableModel tm = new DefaultTableModel(new Object[]{"A", "B", "C"}, 0);
tm.addRow(new Object[]{"1", "2", "3", "4"});
tm.addRow(new Object[]{"5", "6", "7", "8"});
tm.addRow(new Object[]{"9", "10", "11", "12"});
tm.addRow(new Object[]{"13", "14", "15", "16"});
final JTable table = new JTable(tm);
final JScrollPane scrollPane = new JScrollPane(table);
/**
* For some reason, the header isn't being applied as soon as the
* table is added to the scroll pane, so we need to jump our next
* request to the end of the of event queue so that it will
* occur some time in the future
*/
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
scrollPane.setColumnHeaderView(header);
}
});
table.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
column.setWidth(table.getWidth());
}
});
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(scrollPane);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
Попробуйте принять значения по умолчанию от UIManager
:
Color color = UIManager.getColor("TableHeader.background");
Border border = UIManager.getBorder("TableHeader.CellBorder");
Вам нужно настроить внешний вид приложения, прежде чем пытаться:
header.setBackground(UIManager.getColor(new JTableHeader().getBackground()));
header.setBorder(UIManager.getBorder(new JTableHeader().getBorder()));
сначала вы должны выглядеть и чувствовать себя так:
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception e) {
// If Nimbus is not available, you can set the GUI to another look and feel.
}
Вот пример:
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.JTableHeader;
public class Test {
public Test() {
initComponents();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
//set nimbus look and feel
for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
new Test();
}
});
}
private void initComponents() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel header = new JLabel("Title");
header.setBackground(UIManager.getColor(new JTableHeader().getBackground()));
header.setBorder(UIManager.getBorder(new JTableHeader().getBorder()));
frame.add(header);
frame.pack();
frame.setVisible(true);
}
}
Я решил, что создам JTable
без каких-либо строк и поместите JTextPane
прямо под И это работает как шарм.
JTextPane textPane = new JTextPane();
JPanel panel = new JPanel(new BorderLayout());
JTable table = new JTable(0, 1);
table.setPreferredScrollableViewportSize(new Dimension(600, 0));
JScrollPane js = new JScrollPane(table)
panel.add(js, BorderLayout.NORTH);
panel.add(new JScrollPane(textPane),BorderLayout.CENTER);