Java, Swing


      
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





      
Java, Swing   
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




      
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



      
Java, Swing   
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




      
Java, Swing   
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




      
Java, Swing   
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);




      
Java, Swing   
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);




      
Java, Swing   
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);
   }
}




      
Java, Swing   
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



      
Java, Swing   
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