Java, Swing |
05.03.2024
Timer
javax.swing.Timer;
Timer timer = new Timer(20, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
doSomething();
}
});
timer.setRepeats(true); // true -> viele Aufrufe von doSomething() bis timer gestoppt wird; false -> nur ein Aufruf von doSomething()
timer.setCoalesce(true);
timer.start();
Stichworte:
Java, Swing, Timer, Beispiel
09.11.2023
JTable - Zeile/Spalte des aktiven CellEditors herausfinden
Um in einer JTable kann man die Position (Zeile, Spalte) des aktiven CellEditors durch folgende Methoden ermitteln:
JTable table = new ...
int rowOfActiveCellEditor = table.getEditingRow();
int colOfActiveCellEditor = table.getEditingColumn();
Stichworte:
JTable, CellEditor, Spalte und Zeile ermitteln
JTable, CellEditor, Spalte und Zeile ermitteln
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