Java, Swing


      
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



      
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




      
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



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



      
Java, Swing
14.06.2022

JTable, Spaltenbreite setzen



JTable table = new JTable(10, 20);
// 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