Java, Swing |
19.11.2022
JLabel, Hintergrundfarbe setzen 
JLabel label = new JLabel();
label.setOpaque(true); // wichtig!
label.setBackground(Color.CYAN);
JLabel, Innenabstand zum Text setzen
17.11.2022
JLabel: Innenabstand zum Text setzen 
Folgender Code zeigt, wie man den Innenabstand vom Text zum JLabel setzt:
import java.awt.Color;
import java.awt.FlowLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
public class LabelPadding {
public LabelPadding() {
JFrame frame = new JFrame("JLabel mit Padding");
initGUI(frame);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private void initGUI(JFrame frame) {
JLabel label = new JLabel("Labeltext");
EmptyBorder eBorder = new EmptyBorder(6, 6, 6, 6); // oben, rechts, unten, links
LineBorder lBorder = new LineBorder(new Color(96, 96, 96));
label.setBorder(BorderFactory.createCompoundBorder(lBorder, eBorder));
frame.setLayout(new BorderLayout());
frame.add(label, BorderLayout.CENTER);
}
public static void main(String[] args) {
new LabelPadding();
}
}
JLabel, Hintergrundfarbe setzen
Stichworte:
JLabel, Innenabstand zum Text, Rand, padding
JLabel, Innenabstand zum Text, Rand, padding
03.11.2022
JTable, Bereich selektieren 
JTable table = new JTable(4, 4); // 4 rows, 4 columns
table.setColumnSelectionInterval(1, 2); // Selektiert die mittleren beiden Spalten
table.setRowSelectionInterval(1, 2); // Selektiert die mittleren beiden Zeilen
Stichworte:
JTable, Bereiche selektieren, programmatisch selektieren
JTable, Bereiche selektieren, programmatisch selektieren
03.11.2022
JTable, Focus-Rahmen auf Zelle beschränken (statt auf Zeile) 
JTable table = new JTable(2, 2); // 2 rows, 2 columns
table.setColumnSelectionAllowed(true);
01.11.2022
KeyEvent, selber senden 
Im folgenden Beispiel wird ein KeyEvent an eine JTable gesendet:
JTable table = new JTable();
int key = KeyEvent.VK_DOWN;
Component target = table;
KeyEvent pressed = new KeyEvent(target, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, key, (char) key, 1);
KeyEvent typed = new KeyEvent(target, KeyEvent.KEY_TYPED, System.currentTimeMillis(), 0, 0, (char) key);
KeyEvent released = new KeyEvent(target, KeyEvent.KEY_RELEASED, System.currentTimeMillis(), 0, key, (char) key, 1);
EventQueue queue = Toolkit.getDefaultToolkit().getSystemEventQueue();
queue.postEvent(pressed);
queue.postEvent(typed);
queue.postEvent(released);
05.10.2022
JTestField auf numerische Eingabe beschränken 
Im folgenden Code-Beisiel werden nur numerische Eingaben akzeptiert:
Dazu wird ein eigenes Document „NumberDocument“ definiert.
package com.sowas.itwiki.snippets;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
import javax.swing.text.AttributeSet;
import java.math.BigDecimal;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class NumberDocument extends PlainDocument {
@Override
public void insertString (final int offset, final String text,
final AttributeSet attributeSet) throws BadLocationException {
if (isNumber(text)){
super.insertString (offset, text, attributeSet);
}
}
protected boolean isNumber (final String text) {
try {
if (text.length() > 0){
// Versuchen eine Zahl zu erzeugen:
new BigDecimal(text);
}
return true;
}catch (final NumberFormatException e){
// Hat nicht geklappt, also keine Zahl
}
return false;
}
public static void main (final String [] ignored){
JFrame frame = new JFrame ("Numerisches JTextField");
frame.getContentPane().setLayout (new BorderLayout (0,0));
frame.getContentPane().add(new JTextField (new NumberDocument (), "", 0), BorderLayout.NORTH);
frame.pack ();
frame.setVisible (true);
}
}
15.06.2022
JTable, mit Zeilenbeschriftung 
Manchmal möchte man auch für die Zeilen einer Tabelle eine Beschriftung, so wie es bei Tabellenkalkulationen üblich ist. Dies kann man durch eine zusätzliche Liste links neben der Tabelle erreichen.
package com.sowas.javawiki.rowheadertable;
import java.awt.BorderLayout;
import java.awt.Component;
import javax.swing.AbstractListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListCellRenderer;
import javax.swing.ListModel;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
public class RowHeaderTable extends JFrame {
public RowHeaderTable(){
super("Row Header Table");
ListModel lm = new RowHeaderListModel();
DefaultTableModel dtm = new DefaultTableModel(lm.getSize(), 4);
JTable table = new JTable(dtm);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JList rowHeader = new JList(lm);
rowHeader.setFixedCellWidth(30);
rowHeader.setFixedCellHeight(table.getRowHeight());
rowHeader.setCellRenderer(new RowHeaderRenderer(table));
JScrollPane scroll = new JScrollPane(table);
scroll.setRowHeaderView(rowHeader);
getContentPane().add(scroll, BorderLayout.CENTER);
}
public static void main(String[] args){
RowHeaderTable frame = new RowHeaderTable();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class RowHeaderListModel extends AbstractListModel{
String strRowHeaders[] = {"1", "2", "3", "4", "5", "6", "7"};
public int getSize(){
return strRowHeaders.length;
}
public Object getElementAt(int index){
return strRowHeaders[index];
}
}
class RowHeaderRenderer extends JLabel implements ListCellRenderer{
RowHeaderRenderer(JTable table){
JTableHeader tableHeader = table.getTableHeader();
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
setHorizontalAlignment(CENTER);
setForeground(tableHeader.getForeground());
setOpaque(true); // Damit der Hintergrund nicht verändert wird
setFont(tableHeader.getFont());
}
public Component getListCellRendererComponent(JList list, Object value, int index,
boolean fSelected, boolean fCellHasFocus){
setText((value == null) ? "" : value.toString());
return this;
}
}
JTable, ein einfaches Beispiel
15.06.2022
JTable, Spalten fixieren 
Normalerweise können Spalten einfach mit der Maus verschoben werden. Möchte man dies unterbinden, so hilft Folgendes:
JTable table = new JTable(10, 20);
table.getTableHeader().setReorderingAllowed(false);
JTable, ein einfaches Beispiel
14.06.2022
JTable, Zelle zentrieren 
public class MyCellRenderer extends JLabel implements TableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
return this;
}
}
… und dieser muss dann noch der Tabelle zugewiesen werden:
JTable table = new JTable(..
table.setDefaultRenderer(Object.class, new MyCellRenderer());
JTable, ein einfaches Beispiel
14.06.2022
JTable, Spaltenbreite setzen 
JTable table = new JTable(10, 20);
// Autoresizing abschalten, sonst sind alle Spalten gleich breit:
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
// Erste Spalte auf 100 Pixel Breite setzen:
final int INDEX_COLUMN1 = 0;
TableColumn col = table.getColumnModel().getColumn(INDEX_COLUMN1);
col.setPreferredWidth(100);
JTable, ein einfaches Beispiel