Swing Optimale Spaltenbreite auf Doppelklick (JTable)

Status
Nicht offen für weitere Antworten.

KrokoDiehl

Top Contributor
Hallo zusammen.
Ich habe eine JTable und möchte gern die Funktionalität implementieren, dass sich die Spalten automatisch auf die optimale Breite anpassen, wenn man an den Rand des Spaltenkopfes doppelklickt. Ein ähnliches Verhalten kennt man z.B. aus MS Excel oder auch aus Eclipse (und vielen andren GUIs).
Diese automatische Anpassung soll nur erfolgen, wenn man den Resizing-Cursor hat (also am rechten Rand der Spalte).

Ich habe bisher herumprobiert, bin aber auf noch keine zufriedenstellende Lösung gekommen:
Mittels eines MouseListeners am JTableHeader reagiere ich derzeit auf den Doppelklick. Problem ist aber, dass dieser Doppelklick überall wirkt. Ich möchte es aber nur am (rechten) Rand der Spalte haben.

Was mir bisher nur einfällt ist via Mausposition etc. prüfen, ob sich der Cursor in der Nähe des Spaltenendes befindet... aber ich habe das dumpfe Gefühl, dass es auch viel einfacher geht, da es ja fast so etwas wie Standardfunktionalität ist.

Hier ein bisschen Code:
Java:
...
table.getTableHeader().addMouseListener(new ResizeListener(table));
...
@Override
public void mouseClicked(MouseEvent event)
{
    if ( SwingUtilities.isLeftMouseButton(event) && event.getClickCount() == 2 )
    {
        int col = table.columnAtPoint(event.getPoint());
        // hier Abfrage, ob der Cursor am Spaltenrand ist...

        table.resizeColumnToContents(col); // diese Methode habe ich schon und sie geht
    }
}

Also meine Frage: Kennt jemand hierfür einen direkteren / einfacheren Weg?
 

André Uhres

Top Contributor
Diese automatische Anpassung soll nur erfolgen, wenn man den Resizing-Cursor hat
Versuch mal den "cursor type" abzufragen (E_RESIZE_CURSOR / W_RESIZE_CURSOR);
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class WidthAdjuster extends MouseAdapter {

    private JTable table;
    private static final int EPSILON = 5;   //boundary sensitivity
    private static final Cursor EAST = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR);
    private static final Cursor WEST = Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR);

    public WidthAdjuster(final JTable table) {
        this.table = table;
        table.getTableHeader().addMouseListener(this);
    }

    @Override
    public void mousePressed(final MouseEvent evt) {
        if (evt.getClickCount() > 1 && usingResizeCursor()) {
            resize(getLeftColumn(evt.getPoint()));
        }
    }

    private JTableHeader getTableHeader() {
        return table.getTableHeader();
    }

    private boolean usingResizeCursor() {
        Cursor cursor = getTableHeader().getCursor();
        return cursor.equals(EAST) || cursor.equals(WEST);
    }

    //if near the boundary, will choose left column
    private int getLeftColumn(final Point pt) {
        pt.x -= EPSILON;
        return getTableHeader().columnAtPoint(pt);
    }

    private void resize(final int col) {
        TableColumnModel tcm = table.getColumnModel();
        TableColumn tc = tcm.getColumn(col);
        TableCellRenderer tcr = tc.getHeaderRenderer();
        if (tcr == null) {
            tcr = table.getTableHeader().getDefaultRenderer();
        }
        Object obj = tc.getHeaderValue();
        Component comp = tcr.getTableCellRendererComponent(table, obj, false, false, 0, 0);
        int maxWidth = comp.getPreferredSize().width;

        for (int i = 0, ub = table.getRowCount(); i != ub; ++i) {
            tcr = table.getCellRenderer(i, col);
            obj = table.getValueAt(i, col);
            comp = tcr.getTableCellRendererComponent(table, obj, false, false, i, col);
            int w = comp.getPreferredSize().width;
            if (w > maxWidth) {
                maxWidth = w;
            }
        }
        maxWidth += 10; //and room to grow...
        tc.setPreferredWidth(maxWidth); //remembers the value
        tc.setWidth(maxWidth);          //forces layout, repaint
    }

    public static void main(final String[] args) {
        Runnable gui = new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setSize(400, 300);
                f.setLocationRelativeTo(null);
                JTable table = new JTable(4, 4);
                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                f.add(new JScrollPane(table));
                new WidthAdjuster(table);
                f.setVisible(true);
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}
 
Zuletzt bearbeitet:

KrokoDiehl

Top Contributor
Stimmt, das ist eine gute Möglichkeit und funktioniert nahezu perfekt. Störend ist noch, dass wenn ein RowSorter gesetzt ist, er die Spalte dann noch sortiert. Ich habe es mit
Code:
event.consume()
versucht aber da die Reihenfolge der MouseListener nicht fix ist, denke ich, wird das etwas umständlicher.
Aber bis dahin reicht das erstmal. Bisher ist es nur eine nice-to-have Funktionalität.
Danke dir.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W JavaFX Button - optimale Breite berechnen AWT, Swing, JavaFX & SWT 1
W Swing Optimale Fenstergröße festlegen AWT, Swing, JavaFX & SWT 4
N Swing Optimale Höhe eine JTextPanes bei festgelegter Breite bestimmen AWT, Swing, JavaFX & SWT 23
R JTextArea in JTable und die optimale Zeilenhöhe AWT, Swing, JavaFX & SWT 11
richis-fragen Spaltenbreite bei drag nicht änderbar AWT, Swing, JavaFX & SWT 4
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
M Gridbaglayout Spaltenbreite AWT, Swing, JavaFX & SWT 3
S Jtable dynamische Spaltenbreite AWT, Swing, JavaFX & SWT 5
0 JTable Spaltenbreite automatisch an Inhalt anpassne geht nicht AWT, Swing, JavaFX & SWT 3
T jTable Spaltenbreite lässt sich nicht ändern AWT, Swing, JavaFX & SWT 8
A Swing Anpassen der Spaltenbreite durch die länge eines Strings AWT, Swing, JavaFX & SWT 3
1 Swing Spaltenbreite and CellEditor- Komponente anpassen AWT, Swing, JavaFX & SWT 4
R JTable: Spaltenbreite automatisch anpassen AWT, Swing, JavaFX & SWT 3
F Swing Spaltenbreite wird nicht gesetzt AWT, Swing, JavaFX & SWT 6
jueki Event bei Änderung der Spaltenbreite in einem JTable AWT, Swing, JavaFX & SWT 15
TiME-SPLiNTER Swing JTable Spaltenbreite beibehalten AWT, Swing, JavaFX & SWT 13
T JTable erst nach Änderung der Spaltenbreite neu zeichnen AWT, Swing, JavaFX & SWT 10
B Swing minimale Spaltenbreite für JTable AWT, Swing, JavaFX & SWT 2
T Spaltenbreite bei jTabel in Kombination mit Srollbalken AWT, Swing, JavaFX & SWT 2
L JTable automatische Spaltenbreite AWT, Swing, JavaFX & SWT 2
J JTable Spaltenbreite AWT, Swing, JavaFX & SWT 8
T JTable SpaltenBreite will einfach nich klappen AWT, Swing, JavaFX & SWT 4
M Spaltenbreite mit Sortierung AWT, Swing, JavaFX & SWT 3
J jTable, welcher listener für Änderung der Spaltenbreite AWT, Swing, JavaFX & SWT 2
D wiedermal JTable und die Spaltenbreite. AWT, Swing, JavaFX & SWT 8
S JTable Spaltenbreite AWT, Swing, JavaFX & SWT 2
T jTable / Spaltenbreite und Position AWT, Swing, JavaFX & SWT 2
K Spaltenbreite von mehreren Tabellen gleichzeitig verändern AWT, Swing, JavaFX & SWT 3
A JTable - Aktualisierung und Spaltenbreite AWT, Swing, JavaFX & SWT 5
J Probleme mit Spaltenbreite bei GridBagLayout AWT, Swing, JavaFX & SWT 19
S JTable und spaltenbreite AWT, Swing, JavaFX & SWT 2
G JTable: Spaltenbreite automatisch setzen AWT, Swing, JavaFX & SWT 4
L JTable -> Spaltenbreite ändern! AWT, Swing, JavaFX & SWT 3
J Spaltenbreite JTable AWT, Swing, JavaFX & SWT 7
C Swing Component bei Doppelklick löschen AWT, Swing, JavaFX & SWT 4
P Swing JFrame minimiert sich bei Doppelklick auf die Titel-Leiste AWT, Swing, JavaFX & SWT 16
P JFrame schrumpft bei Doppelklick auf die Titelleiste AWT, Swing, JavaFX & SWT 0
I JTable: Doppelklick auf Table soll neues Fenster öffnen und Daten aus JTable anzeigen AWT, Swing, JavaFX & SWT 4
T JTree - Elemente mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 6
C Swing Fensterresize durch doppelklick - wie die neue Grösse erhalten? AWT, Swing, JavaFX & SWT 3
TheWhiteShadow Swing JTextPanel Auswahlkriterium bei Doppelklick AWT, Swing, JavaFX & SWT 3
propra Doppelklick von Einzelklick unterscheiden, aber richtig ... AWT, Swing, JavaFX & SWT 10
J Doppelklick Event AWT, Swing, JavaFX & SWT 32
Landei Swing JTree - Element mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 4
O AWT Automatischer Doppelklick AWT, Swing, JavaFX & SWT 3
T JTable: editieren bei Doppelklick deaktivieren, aber... AWT, Swing, JavaFX & SWT 2
C Swing MouseListener Doppelklick-Geschwindigkeit AWT, Swing, JavaFX & SWT 4
M Doppelklick auf JTextField AWT, Swing, JavaFX & SWT 2
G JTree und doppelklick AWT, Swing, JavaFX & SWT 4
S Auswahlfenster: Datei beim Doppelklick öffnen AWT, Swing, JavaFX & SWT 8
Go ein "JLabel" mit Doppelklick editieren. AWT, Swing, JavaFX & SWT 5
M Doppelklick auf Component abfangen AWT, Swing, JavaFX & SWT 5
Daniel_L JTable - Links-rechts-Klick ist gleich Doppelklick? AWT, Swing, JavaFX & SWT 2
G JTable auf Doppelklick reagieren AWT, Swing, JavaFX & SWT 4
B MouseListener / doppelklick geht net AWT, Swing, JavaFX & SWT 16
F Ignoriere Mausklick falls erster Klick von Doppelklick . AWT, Swing, JavaFX & SWT 4
W MouseListener, getClickCount und Doppelklick AWT, Swing, JavaFX & SWT 6
S Bei SWT in einer Tabelle ein Event per Doppelklick auslösen? AWT, Swing, JavaFX & SWT 3
R mit SelectionListener Doppelklick? AWT, Swing, JavaFX & SWT 10
G JInternalFrame mit Doppelklick schließen möglich? AWT, Swing, JavaFX & SWT 2
R SWT-TreeViewer Doppelklick verarbeiten AWT, Swing, JavaFX & SWT 4
T JList + Doppelklick feststellen AWT, Swing, JavaFX & SWT 4
S [JTable] Editor erst nach Doppelklick AWT, Swing, JavaFX & SWT 5
C Aktion auführen nach Doppelklick auf Zeile in JTable AWT, Swing, JavaFX & SWT 10
T Zeile in JTable mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 8
J Doppelklick auf JPanel AWT, Swing, JavaFX & SWT 3
J JList - doppelklick auf item -> neues fenster öffnet sich AWT, Swing, JavaFX & SWT 2
D Doppelklick in JList --> Wert auslesen AWT, Swing, JavaFX & SWT 8
E JTable: Selektion nur mit einem Doppelklick? AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben