einen Prototyp-Wert (für die automatische Breitenberechnung) einer JTable Spalten-Einstelldaten

StackOverflow https://stackoverflow.com/questions/838095

Frage

entweder diese nicht existieren, oder ich denke nicht / Suche richtig, weil es spät ...

Ich mag eine JTable Spaltenbreite in Swing auf einem Prototyp-Wert für den größten String setzen, basierend erwarten ich (oder weiß) in einer bestimmten Spalte zu existieren. Ich weiß nicht, die Anzahl der Pixel, da ich nicht unbedingt die Schrift bei der Kompilierung kennen.

Gibt es eine Möglichkeit, einen Prototyp Wert für Spaltenbreite Zwecke zu setzen, der Weg dorthin für Zeilenhöhe ist ähnlich? Wenn ja, wie?

War es hilfreich?

Lösung

Haben Sie versucht, eine JLabel zur Laufzeit der Erstellung und Verwendung seiner Größe Ihrer Tabelle, um die Größe?

// create a label that will be using the run-time font
JLabel prototypeLabel = new JLabel("Not Applicable")

// get the labels preferred sizes
int preferredWidth = prototypeLabel.getPreferredSize().getWidth();
int preferredHeight = prototypeLabel.getPreferredSize().getHeight();

// set the sizes of the table's row and columns
myTable.setRowHeight(preferredHeight);

for(TableColumn column : myTable.getColumnModel.getColumns()){
   column.setPreferredWidth(preferredWidth);        
}

Andere Tipps

Sie können versuchen, den folgenden Code:

/**
 * Sets the preferred width of the columns of a table from prototypes
 * @param table the target table
 * @param prototypes an array of prototypes, {@code null} values will be ignored
 * @param setMaxWidth {@code true} if the maximum column width should also be set
 */
public static void setWidthFromPrototype(JTable table, Object[] prototypes, boolean setMaxWidth) {
if (prototypes.length != table.getColumnCount())
  throw new IllegalArgumentException("The prototypes array should contain exactly one element per table column");
for (int i = 0; i < prototypes.length; i++) {
    if (prototypes[i] != null) {
        Component proto = table.getCellRenderer(0,i)
                .getTableCellRendererComponent(table, prototypes[i], false, false, 0, i);
        int prefWidth = (int) proto.getPreferredSize().getWidth() + 1;
        table.getColumnModel().getColumn(i).setPreferredWidth(prefWidth);
        if (setMaxWidth)
            table.getColumnModel().getColumn(i).setMaxWidth(prefWidth);
    }
}
}

SwingX erweitert JXTable / Spalte Unterstützung Prototypen für die anfängliche Spaltenbreite Dimensionierung eingestellt haben, können Sie dies tun, entweder nach den Spalten erstellt

wurden
for(int col = 0; ....) {
    table.getColumnExt(col).setPrototypeValue(myPrototype[col]
}

oder durch eine benutzerdefinierte ColumnFactory Implementierung, die die Spalten bei der Erstellung konfiguriert

ColumnFactory factory = new ColumnFactory() {
    @Override
    protected void configureTableColumn(TableModel model, TableColumnExt columnExt) {
        super(...);
        columnExt.setPrototypeValue(myPrototype[columnExt.getModelIndex()];
    }
}
table.setColumnFactory(factory);
table.setModel(myModel);

Statt ein Label zu erstellen, die tatsächliche Komponente aus dem Table bekommen und testen Sie die Größe auf, dass:

// create the component that will be used to render the cell
Comp prototype = table.getDefaultRenderer(model.getColumnClass(i)).getTableCellRendererComponent(table, "Not Applicable", false, false, 0, i);

// get the labels preferred sizes
int preferredWidth = comp.getPreferredSize().getWidth();
int preferredHeight = comp.getPreferredSize().getHeight();

Dies ist eine einzelne Spalte Beispiel, müssen Sie dies wiederholen, um die Größe für jede Spalte zu bekommen (und setzen es auch). Siehe http://www.exampledepot.com/egs/javax.swing .table / PackCol.html für ein Beispiel dafür.

Wenn Sie nicht über die Schrift bei der Kompilierung kennen dann die Breite jeder JTable Spalte wird immer unbekannt sein. Als Plausibilitätsprüfung, ein Textdokument öffnen und mit verschiedenen Schriftarten unter Beibehaltung der Punktgröße konstant spielen. Die Länge von dem, was geschrieben wird, hängt von einer Schriftart-by-Schrift Basis aber die Höhe nicht.

Die Höhe einer JTable Zeile sollte für jede Schriftgröße (in Punkten) bestimmt werden können, da es sich um eine Standard definiert. Es könnte ein bisschen zu experimentieren nehmen, obwohl gegeben, dass JTable wahrscheinlich ein bisschen Abstand dazwischen Zellen gibt.

Wenn Sie nicht weder die Schriftgröße garantieren noch die Schrift selbst bei der Kompilierung dann in Ich bin interessiert, welche Antworten andere Menschen kommen mit:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top