2013-08-21 18 views
6
  • wie JLabel in Glasspane Stick Koordinaten von JProgressBar rellative, schwimmend ohne ComponentListener oder einen anderen Zuhörer,Layout Manager und Positionierung

  • wird built_in Anmeldern in Standard-LayoutManagers, die über seinen internen Zustand mitteilen kann, und kann für die Übersteuerung, anstatt mein Versuch mit ComponentListener und NullLayout

enter image description here

zugänglich sein 210

.

enter image description here

SSCCE über ComponentListener und mit NullLayout

import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.GridBagConstraints; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 
import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JProgressBar; 
import javax.swing.JRadioButton; 
import javax.swing.UIManager; 
//http://stackoverflow.com/questions/14560680/jprogressbar-low-values-will-not-be-displayed 
public class ProgressSample { 

    private JFrame frame = new JFrame("GlassPane instead of JLayer"); 
    private JLabel label; 
    private GridBagConstraints gbc = new GridBagConstraints(); 
    private JProgressBar progressSeven; 

    public ProgressSample() { 
     frame.setLayout(new FlowLayout()); 
     frame.add(new JButton("test")); 
     frame.add(new JCheckBox("test")); 
     frame.add(new JRadioButton("test")); 
     // Nothing is displayed if value is lover that 6 
     JProgressBar progressSix = new JProgressBar(0, 100); 
     progressSix.setValue(2); 
     frame.add(progressSix); 
     // but this works value is higher that 6 
     progressSeven = new JProgressBar(0, 100); 
     progressSeven.addComponentListener(new ComponentAdapter() { 
      @Override 
      public void componentMoved(ComponentEvent e) { 
       label.setBounds(
         (int) progressSeven.getBounds().getX(), 
         (int) progressSeven.getBounds().getY(), 
         progressSeven.getPreferredSize().width, 
         label.getPreferredSize().height); 
      } 
     }); 
     progressSeven.setValue(7); 
     frame.add(progressSeven); 
     label = new JLabel(); 
     label.setText("<html>Blablabla, Blablablabla<br>" 
       + "Blablabla, Blablablabla<br>" 
       + "Blablabla, Blablablabla</html>"); 
     label.setPreferredSize(new Dimension(
       progressSeven.getPreferredSize().width, 
       label.getPreferredSize().height)); 
     Container glassPane = (Container) frame.getRootPane().getGlassPane(); 
     glassPane.setVisible(true); 
     glassPane.setLayout(null); 
     glassPane.add(label, gbc); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     try { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     ProgressSample dialogTest = new ProgressSample(); 
    } 
} 
+1

+1 für 'SSCCE' ... – Reimeus

+1

' layoutContainer() 'kann ein Ereignis außer Kraft gesetzt werden, um zu schießen, die von einem benutzerdefinierten Layout-Manager für die Glasscheibe angehört werden konnte. Ich bin mir nicht sicher, ob du das willst. – kiheru

+0

_without ComponentListener oder anderen listener_ was für eine seltsame Anforderung, Hausaufgaben? kleopatra

Antwort

5

wie JLabel in Glasspane kleben rellative, Koordinaten floating von JProgressBar ohne ComponentListener zu verwenden oder einen anderen Zuhörers

Meine Idee wäre, das t zu wickeln Wo Komponenten in einem Container mit der OverlayLayout und "Play" mit AlignementX/AlignementY für die relativen Koordinaten. Dann legen Sie den Verpackungsbehälter einfach in die ursprüngliche Hierarchie. (Siehe meine SSCCE unten)

ist es built_in Anmeldern in Standard-LayoutManagers die über seinen internen Zustand mitteilen kann und für Überschreibung statt mein Versuch mit ComponentListener und NullLayout

Es erreichbar sein ist kein solcher Vertrag in der LayoutManager API, daher können Sie sich nicht sicher auf einen solchen Mechanismus verlassen. Darüber hinaus werden Sie Probleme mit dem Standard-LayoutManager haben, da sie Ihre zusätzlichen JLabel im Layout berücksichtigen.

Stellen Sie sich vor, Sie verwenden FlowLayout und Sie setzen 1 Komponente, dann Ihre extra JLabel, dann eine andere Komponente. Wenn Sie das Extra JLabel verschieben, bleibt die letzte Komponente "weg" von der ersten Komponente und Sie sehen eine Lücke zwischen diesen beiden.

Wenn dieses letzte Problem ist kein Problem, könnte man einfach erweitern FlowLayout (oder jede andere LayoutManager), außer Kraft setzen layoutContainer und legen Sie die zusätzlichen JLabel wo immer Sie möchten.

import java.awt.Container; 
import java.awt.FlowLayout; 
import java.awt.GridBagConstraints; 

import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JProgressBar; 
import javax.swing.JRadioButton; 
import javax.swing.OverlayLayout; 
import javax.swing.UIManager; 

//http://stackoverflow.com/questions/14560680/jprogressbar-low-values-will-not-be-displayed 
public class ProgressSample { 

    private JFrame frame = new JFrame("GlassPane instead of JLayer"); 
    private JLabel label; 
    private GridBagConstraints gbc = new GridBagConstraints(); 
    private JProgressBar progressSeven; 

    public ProgressSample() { 
     frame.setLayout(new FlowLayout()); 
     frame.add(new JButton("test")); 
     frame.add(new JCheckBox("test")); 
     frame.add(new JRadioButton("test")); 
     // Nothing is displayed if value is lover that 6 
     JProgressBar progressSix = new JProgressBar(0, 100); 
     progressSix.setValue(2); 
     frame.add(progressSix); 
     JPanel wrappingPanel = new JPanel(); 
     OverlayLayout mgr = new OverlayLayout(wrappingPanel); 
     wrappingPanel.setLayout(mgr); 
     progressSeven = new JProgressBar(0, 100); 
     progressSeven.setAlignmentX(0.0f); 
     progressSeven.setAlignmentY(0.0f); 
     frame.add(wrappingPanel); 
     label = new JLabel(); 
     label.setText("<html>Blablabla, Blablablabla<br>" + "Blablabla, Blablablabla<br>" + "Blablabla, Blablablabla</html>"); 
     label.setAlignmentX(0.0f); 
     label.setAlignmentY(0.0f); 
     wrappingPanel.add(label); 
     wrappingPanel.add(progressSeven); 
     Container glassPane = (Container) frame.getRootPane().getGlassPane(); 
     glassPane.setVisible(true); 
     glassPane.setLayout(new FlowLayout()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     try { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     ProgressSample dialogTest = new ProgressSample(); 
    } 
} 
+0

+1 hmmm stimme zu, wahrscheinlich beantworte ich meine Frage ....., dann könnte ich besser, sicherer verwenden [JProgressBar als Container (wie immer für mich)] (http: // stackoverflow.com/a/18355235/714968), btw diese Frage basiert auf meinen Kenntnissen fehlt auf Code geschrieben dort als meine Antwort, – mKorbel

+0

@mKorbel Es gibt einen Nachteil, 'JProgressBar' als Behälter zu verwenden: der Fortschrittsbalken wird sich über den gesamten erstrecken Grenzen zur Verfügung gestellt, so dass es ziemlich komisch aussieht. –

+0

Grenzen sind Nebeneffekt, verursacht durch den verwendeten LayoutManager, z. GBC verursachte das gleiche Problem für JPanel, Sie haben recht, das ist kein Standard in Swing, ziemlich Anforderungen in Htlm5/JavaFX – mKorbel