Swing Teile eines JPanel in eigene Klasse auslagern

Lorke

Mitglied
Hallo,

ich möchte einen Teil eines JPanel in eine eigene KLasse auslagern um ihn wiederzuverwenden.
Bsp. (hab' mehrere solcher 'Patienten'):
Java:
private JPanel getSuchString(){
    FormLayout lay = new FormLayout(
             "10dlu,50dlu,2dlu,90dlu,10dlu,p,2dlu,50dlu:g,10dlu,50dlu,5dlu,50dlu,5dlu,50dlu,2dlu,50dlu,2dlu,50dlu,10dlu",    // xwerte,
             "10dlu,p,2dlu,150dlu:g,5dlu,p,2dlu,80dlu,0dlu"                                                                    // ywerte
            );
    //PanelBuilder builder = new PanelBuilder(lay);
    PanelBuilder builder = new PanelBuilder(lay, new FormDebugPanel());
    builder.getPanel().setOpaque(false);
    CellConstraints cc = new CellConstraints();
    int colNb=2, rowNb=2;
//...   
    builder.addLabel("Suche", cc.xy(colNb, rowNb));

    colNb += 2;
    String[] args = {"dummy1","dummy2","dummy3","dummy4"};
    cBx = new JComboBox(args);
    cBx.setSelectedIndex( vorauswahl );
    builder.add(cBx, cc.xy(colNb,rowNb));       

// auslagern Start
    colNb += 2;
    builder.addLabel("in", cc.xy(colNb, rowNb));
   
    colNb += 2;
    cBoxA = new JCheckBox ("dummyA");
    builder.add(cBoxA,cc.xy(colNb, rowNb,CellConstraints.FILL,CellConstraints.DEFAULT));
    colNb += 2;
    cBoxB = new JCheckBox ("dummyB");
    builder.add(cBoxB,cc.xy(colNb, rowNb,CellConstraints.FILL,CellConstraints.DEFAULT));
    colNb += 2;
    cBoxC = new JCheckBox ("dummyC");
    builder.add(cBoxC,cc.xy(colNb, rowNb,CellConstraints.FILL,CellConstraints.DEFAULT));
// auslagern Ende

//...
    return builder.getPanel();
}
Die betreffenden Elemente zwischen den 'auslagern'-Kommentaren sollen auf ein (Sub-)Panel, das dann statt der einzelnen Elemente an gleicher Stelle eingebunden wird. Abfrage des Zustandes dann über entspr. get-Methoden.

Wie stell' ich das am geschicktesten an?
 

Harry Kane

Top Contributor
In welcher Klasse befindet sich denn die Methode? So aus dem Kontext gerissen ist es ziemlich schwierig, einen vernünftigen Rat zu geben.
Ich würde tendenziell zwei Wege versuchen:
1. Du übergibst der Klasse, zu der die Methode gehört, eine Instanz einer Klasse oder eines Interfaces (nennen wir sie mal "JPanelConfigurator") mit einer Methode "configure(PanelBuilder builder)" und delegierst den Aufbau der Gui zu einem geeigneten Zeitpunkt an den JPanelConfigurator, indem du in der getSuchString-Methode jPanelConfigurator.configure(builder) aufrufst.
2. Dieser "Halbsatz"
Abfrage des Zustandes dann über entspr. get-Methoden.
macht mich stutzig. Welchen Zustand möchtest du über entspr. get-Methoden abfragen? Den der JCheckBoxen? Wenn ja, würde ich einen anderen Ansatz empfehlen: Schreibe dir ein Datenmodell in Form eines Interfaces, welches getter und setter für boolesche Variablen deklariert, und hänge an die JCheckBoxen ActionListener, die die setter-Methoden aus dem Interface aufrufen. So was habe ich schon mal implementiert und fands ganz nützlich. Das SwitchableIndexPanel gestattet es dem Benutzer, aus einer JList etwas auszuwählen, und anhand der Auswahl entweder sofort oder nach Klick eines JButtons den Zustand eines SwitchableIndexModel zu verändern. Eine Anwendung wäre beispielsweise, in der JList Kunden einzutragen und das SwitchableIndexModel so zu implementieren, dass nach An/Abhaken der JCheckBoxes die Kunden z. B. für einen newsletter registriert werden oder aus der Empfängerliste gestrichen werden. Das ganze wurde mit MigLayout als LayoutManager implementiert (zu dem hatte ich dir schon früher mal geraten).
Java:
public interface SwitchableIndexModel {
  public void toggle(int index, boolean finished);
  public void on(int index, boolean finished);
  public void off(int index, boolean finished);
  public boolean get(int index);
  public String getTrueLabel();
  public String getFalseLabel();
  public String getSelectionLabel();
}
public class SwitchableIndexPanel extends ScrollablePanel{
  public final Icon SHOW_ALL = new ImageIcon(Object.class.getResource("/icons/ShowAllEntries.png"));
  public final Icon HIDE_ALL = new ImageIcon(Object.class.getResource("/icons/HideAllEntries.png"));
  public final Icon TOGGLE_ALL = new ImageIcon(Object.class.getResource("/icons/ToggleAllEntries.png"));
  public final Icon SHOW_MARKED = new ImageIcon(Object.class.getResource("/icons/ShowMarkedEntries.png"));
  public final Icon HIDE_MARKED = new ImageIcon(Object.class.getResource("/icons/HideMarkedEntries.png"));
  public final Icon TOGGLE_MARKED = new ImageIcon(Object.class.getResource("/icons/ToggleMarkedEntries.png"));
  private final JList view;

  public SwitchableIndexPanel(String text, final ListViewAndModel viewAndModel, final SwitchableIndexModel indexModel){
  super(new MigLayout("fill","[grow][]","[][][][][][][][][][][][grow]"));
  JLabel label = new JLabel(text);
  add(label, "split, span");
  add(new JSeparator(), "gapleft rel, growx,wrap");
  JScrollPane pane = new JScrollPane();
  view = new JList();
  view.setModel(viewAndModel);
  view.setCellRenderer(viewAndModel);
  pane.getViewport().setPreferredSize(new Dimension(96, 2));
  pane.setViewportView(view);
  add(pane, "grow, spany 11");
  final JCheckBox toggleOnClick = new JCheckBox("Toggle on click");
  final JCheckBox showSelectedOnly = new JCheckBox(indexModel.getSelectionLabel());
  view.addMouseListener(new MouseAdapter(){
  public void mouseClicked(MouseEvent me){
  int index = view.locationToIndex(me.getPoint());
  if(index < 0) return;
  if(!toggleOnClick.isSelected()) return;
  indexModel.toggle(index, true);
  view.repaint();
  }
  }
  );
  JButton showAllBtn = new JButton(SHOW_ALL);
  showAllBtn.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent ae) {
  for (int i = 0; i < view.getModel().getSize(); i++) {
  boolean flag = i < view.getModel().getSize() -1 ? false : true;
  indexModel.on(i, flag);
  }
  view.repaint();
  }
  });
  JButton hideMarkedBtn = new JButton(HIDE_MARKED);
  hideMarkedBtn.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent ae) {
  int[] selected = view.getSelectedIndices();
  for (int i = 0; i < selected.length; i++) {
  boolean flag = i < selected.length -1 ? false : true;
  int ii = selected[i];
  indexModel.off(ii, flag);
  }
  view.repaint();
  }
  });
  JButton toggleAllBtn = new JButton(TOGGLE_ALL);
  toggleAllBtn.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent ae) {
  for (int i = 0; i < view.getModel().getSize(); i++) {
  boolean flag = i < view.getModel().getSize() -1 ? false : true;
  indexModel.toggle(i, flag);
  }
  view.repaint();
  }
  });
  }
}
 

Lorke

Mitglied
In welcher Klasse befindet sich denn die Methode? [/code]

Da muß ich etwas weiter ausholen:
Bin grade dabei mich in die Sourcen einer bestehenden, komplexen Anwendung einzuarbeiten, die zwar in Java programmiert ist, wo das 'Vererben' aber meist mit copy&paste stattgefunden hat - ein riesiger Haufen Code :-/
Mache kleinere Änderungen/Ergänzungen und versuche in dem Zuge etwas aufzuräumen.
Die Klasse, aus der der Ausschnitt stammt, liefert den Inhalt eines Tabs in einem Tabbed Pane in dem erst eine Datenbankabfrage aus versch. Bestandteilen zusammengesetzt wird, dann das Ergebnis als Tabelle präsentiert und schließlich im dritten Teil versch. Aktionen mit einem der Datensätze möglich sind (Druck,...).
Die Checkboxen (Auswahl, welche Tabellen durchsucht werden; den Suchlauf startet ein Button) sind in 2 weiteren Tabs in anderem Kontext identisch vorhanden, u. dort separat ausprogrammiert.

Hatte auf 'nen Hinweis auf z.B. ein Template für die Klasse gehofft, die die auszulagernden Daten aufnimmt, da die Refactoring-Funktion von Eclipse nicht das liefert was ich mir vor- (bzw. ich mich einfach noch zu blöd an-) stelle...

1. Du übergibst der Klasse, zu der die Methode gehört, eine Instanz einer Klasse oder eines Interfaces (nennen wir sie mal "JPanelConfigurator") mit einer Methode "configure(PanelBuilder builder)" und delegierst den Aufbau der Gui zu einem geeigneten Zeitpunkt an den JPanelConfigurator, indem du in der getSuchString-Methode jPanelConfigurator.configure(builder) aufrufst.
2. Dieser "Halbsatz"

macht mich stutzig. Welchen Zustand möchtest du über entspr. get-Methoden abfragen? Den der JCheckBoxen?
[/code]

Ja. Mein Plan ist das zugehörige Label und die Checkboxen in eine eigene Klasse zu packen, die ein Mini-Panel liefert. Instanzen davon werden an den Stellen eingebunden, wo bisher Kopien des gleichen Codes stehen. *Listener habe ich nicht vor zu verwenden, da der Zustand der Auswahl abgefragt werden kann wenn die Suche startet.


anderen Ansatz empfehlen: Schreibe dir ein Datenmodell in Form eines Interfaces, welches getter und setter für boolesche Variablen deklariert, und hänge an die JCheckBoxen ActionListener, die die setter-Methoden aus dem Interface aufrufen.
[/code]
Vom Umbau der Grundstrukturen lass' ich vorerst noch die Finger - muß mir erst ein wenig 'Handwerkszeug' im Umgang mit Java und den ganzen Bibliotheken erarbeiten. Hab' zwar etliche Jahre uC programmiert, auf dieser Plattform hier bin ich aber noch relativ neu.

Inzwischen hab' ich's geschafft ein paar Subpanels für Fälle ähnlich dem beschriebenen zu bauen und einzubinden. Dabei schlage ich mich noch mit so Banalitäten 'rum wie "Subpanel skaliert nicht wenn ich das Fenster verändere, obwohl das verwendete FormLayout eine Spalte mit 'growing'-Attribut enthält". Muß ich das Subpanel dafür noch irgendwo registrieren?
 

Harry Kane

Top Contributor
Dabei schlage ich mich noch mit so Banalitäten 'rum wie "Subpanel skaliert nicht wenn ich das Fenster verändere, obwohl das verwendete FormLayout eine Spalte mit 'growing'-Attribut enthält". Muß ich das Subpanel dafür noch irgendwo registrieren?
Keine Ahnung. Mit FormLayout kenne ich mich nicht aus. Ich kann mich nur wiederholen: teste mal MigLayout. Wenn es damit konkrete Probleme gibt, bin ich gerne behilflich.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V JavaFX Teile eines Images Transparent machen AWT, Swing, JavaFX & SWT 4
T Swing Einzelne Teile eines Textes färben? AWT, Swing, JavaFX & SWT 10
Developer_X Teile eines Bildes in ein Image stecken AWT, Swing, JavaFX & SWT 9
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
N Teile des GUI verschwinden AWT, Swing, JavaFX & SWT 8
Avalarion SWT Listener auf Label oder Text Teile AWT, Swing, JavaFX & SWT 10
R Menu-Fenster - Teile von Fenster tauschen AWT, Swing, JavaFX & SWT 3
M Aus Bildern teile herausschneiden AWT, Swing, JavaFX & SWT 13
G Dialog "übermalt" Teile des Frames AWT, Swing, JavaFX & SWT 20
jojoge wie kann ich in eine Benennung eines JButtons eine Variable einbauen? AWT, Swing, JavaFX & SWT 6
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
I Einbindung eines jpg/png/icons in eine GUI AWT, Swing, JavaFX & SWT 1
Splayfer Umrandung eines AttributedStrings AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
Jose05 zugreifen auf ein Objekt eines GridPanes AWT, Swing, JavaFX & SWT 0
melaniemueller Verschiebung eines Fensters über Button AWT, Swing, JavaFX & SWT 27
news2swen automatisches erstellen eines Languagefiles AWT, Swing, JavaFX & SWT 1
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
MiMa Schliessen eines FXML Fensters? AWT, Swing, JavaFX & SWT 10
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
L AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit AWT, Swing, JavaFX & SWT 5
B veränderte Größe eines Panels im Vorhinein wissen? AWT, Swing, JavaFX & SWT 1
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
L JavaFX Validierung eines Spinner AWT, Swing, JavaFX & SWT 1
M Builden eines lauffähigen JAR Files AWT, Swing, JavaFX & SWT 3
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
M JavaFX rotieren eines Kreises mit konstanter Geschwindigkeit AWT, Swing, JavaFX & SWT 1
K JavaFX Allgemeine Fragen zu dem Aufbau eines Programms hinsichtlich der Klassen AWT, Swing, JavaFX & SWT 1
M JavaFX Auf ein UI Elemement eines anderen Controllers zugreifen AWT, Swing, JavaFX & SWT 0
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
Tronert JavaFX Linienstärke eines Separators ändern? AWT, Swing, JavaFX & SWT 3
N JavaFX Group: Gezieltes entfernen eines Objects (Rectangle) AWT, Swing, JavaFX & SWT 0
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Drag and Drop eines Buttons AWT, Swing, JavaFX & SWT 0
M NullPointerException bei Übergabe eines RadioButtons AWT, Swing, JavaFX & SWT 11
DaCrazyJavaExpert Swing Extern den Text eines nicht fetsgelegten Buttons bekommen. AWT, Swing, JavaFX & SWT 12
J JavaFX Rectangle innerhalb eines Rectangle oder Panes positionieren? AWT, Swing, JavaFX & SWT 1
C JavaFX Inhalt eines SplitPane's durch Menü-Auswahl ändern? AWT, Swing, JavaFX & SWT 13
J linken Bildausschnitt eines BufferedImage abschneiden AWT, Swing, JavaFX & SWT 4
J bestimmten Bereich eines JPanels drucken AWT, Swing, JavaFX & SWT 2
D LookAndFeel Überschreiben eines UIDelegate AWT, Swing, JavaFX & SWT 0
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
C Zeichen eines 6 -Eckes AWT, Swing, JavaFX & SWT 1
U JavaFX Wechsel der Scene nach betätigen eines Button AWT, Swing, JavaFX & SWT 2
F Screenshot eines JPanel AWT, Swing, JavaFX & SWT 3
S JavaFX TreeItem: Icon am Ende eines Eintrags anhängen AWT, Swing, JavaFX & SWT 2
D TAB Taste innerhalb eines JSpinner AWT, Swing, JavaFX & SWT 2
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
D Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT 9
F Swing Rotation eines Bildes mit beliebigen Koordinaten um den Mittelpunkt AWT, Swing, JavaFX & SWT 3
Cromewell JavaFX Nur bestimmten Teil eines Canvas rendern und anzeigen AWT, Swing, JavaFX & SWT 2
Z Swing Variable eines Objekt aus Hashmap in JList anzeigen AWT, Swing, JavaFX & SWT 1
D Frame beim starten eines anderen Frames schließen AWT, Swing, JavaFX & SWT 2
R Hilfe beim ändern des Hintergrundes eines JFrames AWT, Swing, JavaFX & SWT 9
T Durch klicken eines Buttons Klasse wechseln AWT, Swing, JavaFX & SWT 2
E Swing Copy und Paste eines einzelnen Knoten aus einem JTree AWT, Swing, JavaFX & SWT 1
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
I JavaFX Langes drücken eines Buttons AWT, Swing, JavaFX & SWT 4
B Swing Wie Witdh und Height eines GuiElements bekommen AWT, Swing, JavaFX & SWT 5
M Swing JPanel innerhalb eines Frames verschieben AWT, Swing, JavaFX & SWT 3
J JavaFX Zugriff auf FXML-Variablen eines anderen Controllers AWT, Swing, JavaFX & SWT 2
K Swing Inhalt eines JPanels lesen AWT, Swing, JavaFX & SWT 3
T Nur bestimmte Bereiche eines Fotos bearbeiten AWT, Swing, JavaFX & SWT 0
J Swing Erstellung eines User Interface AWT, Swing, JavaFX & SWT 2
S JavaFX Teil eines Bildes ausschneiden / als neues Bild nutzen AWT, Swing, JavaFX & SWT 8
R Swing Bewegung eines Graphics Objektes innerhalb eines JPanels funktioniert nicht richtig AWT, Swing, JavaFX & SWT 2
O Swing Aufbau eines JFrames AWT, Swing, JavaFX & SWT 2
A JavaFX Hilfe beim Design eines Quiz AWT, Swing, JavaFX & SWT 2
F Instanzierung einer inneren Klasse in Klasse eines anderen Packets AWT, Swing, JavaFX & SWT 3
A befüllen eines JTables mittels Methode AWT, Swing, JavaFX & SWT 10
javampir Swing Wanderung eines JFrames AWT, Swing, JavaFX & SWT 7
J Anfänger GUI Problem bei der Ausführung eines sehr einfachen Programms AWT, Swing, JavaFX & SWT 2
G Swing ComboBox: Auswahl eines Items der Liste durch Eingabe eines Buchstabens AWT, Swing, JavaFX & SWT 3
S Swing Nur den sichtbaren Bereich eines TextPane mit Inhalt darstellem AWT, Swing, JavaFX & SWT 0
I Erstellung eines kleinen Programmes AWT, Swing, JavaFX & SWT 8
H Position eines JLabel in einem JPanel AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Windows Blue-Screen nach anzeigen eines Bildes in Java AWT, Swing, JavaFX & SWT 10
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
HaukeG JavaFX JavaFX Resize und DragAndDrop eines Pane AWT, Swing, JavaFX & SWT 4
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
J Denkfehler bei Aktualisierung eines GUI AWT, Swing, JavaFX & SWT 4
J Logikfehler im erstellen eines GUI AWT, Swing, JavaFX & SWT 3
F JTabbedPane mit Button zum Hinzufügen eines neuen Tabs AWT, Swing, JavaFX & SWT 6
B Event Handling Mausbewegung auch außerhalb eines JFrames registrieren AWT, Swing, JavaFX & SWT 2
U Swing Beim Bedienen eines Buttons JFrame schließen AWT, Swing, JavaFX & SWT 2
A Fehler bei erstellen eines JTextFields AWT, Swing, JavaFX & SWT 2
S Bestimmten Bereich eines Bildes im JFrame mit Scrollpane anzeigen AWT, Swing, JavaFX & SWT 0
C AWT die X koordinate eines Rectangles herrausfinden AWT, Swing, JavaFX & SWT 14
G 2D-Grafik Umrandung eines Winkels (drawArc(..)) AWT, Swing, JavaFX & SWT 4
V Ende eines Frames abwarten AWT, Swing, JavaFX & SWT 7
T hallo, habe ein Problem mit dem pro. eines Threads AWT, Swing, JavaFX & SWT 4
S Swing Auf Änderungen eines Models in der View einer JTable reagieren AWT, Swing, JavaFX & SWT 1
U Größe eines Button im Menü ändern AWT, Swing, JavaFX & SWT 1
B Größer-/Kleinerziehen eines JFrames/JPanels erkennen AWT, Swing, JavaFX & SWT 2
B 2D-Grafik Shade eines Images AWT, Swing, JavaFX & SWT 1
A Swing bei Auswahl und klick eines JComboBox buttons die Klasse eines anderen Projekts aufrufen AWT, Swing, JavaFX & SWT 3
F Submit eines HTML-Formulars in Vaadin AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben