2013-08-21 26 views
6
  • rellative için GlassPane içinde JLabel sopa nasıl ComponentListener veya başka dinleyici,Düzen Yöneticisi ve Konumlandırma

  • kullanmadan JProgressBar koordinatlarını edilir yüzer iç durumu hakkında bilgilendirir Standart LayoutManagers içinde bildirim var built_in, ve, ComponentListener ve NullLayout

enter image description here

ile yerine benim girişimi geçersiz kılma için erişilebilir olabilir 210

. ComponentListener veya başka dinleyici kullanmadan JProgressBar koordinatları yüzen SSCCE yaklaşık ComponentListener ve 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 ... – Reimeus

+1

' layoutContainer() 'cam bölmede için özel bir düzen yöneticisi tarafından dinlenen edilebilir bir olay yangın geçersiz kılınabilir. İstediğin bu olduğundan emin değilim. – kiheru

+0

, ComponentListener veya başka bir dinleyici kullanarak ne yapamazsınız? kleopatra

cevap

5

GlassPane içinde JLabel sopa nasıl rellative için birlikte

enter image description here

,

Benim fikrim t sarmak olurdu OverlayLayout ile bir kapsayıcıda wo bileşenleri ve göreli koordinatlar için AlignementX/AlignementY ile "oynat". Daha sonra sarma kabını orijinal hiyerarşiye yerleştirin. yerine ComponentListener ve NullLayout

ile benim girişimi

Orada,

iç durumu hakkında uyarabilir Standart LayoutManagers içinde bildirim yapacaklar built_in yoktur (aşağıda benim SSCCE bakınız) ve geçersiz kılma için erişilebilir olabilir LayoutManager API'sinde böyle bir sözleşme yoktur, dolayısıyla böyle bir mekanizmaya güvenemezsiniz. Dahası, standart LayoutManager ile ilgili sorunlarla karşılaşacaksınız, çünkü bunlar ek JLabel düzeninizi hesaba katacaklar.

FlowLayout kullandığını düşünün ve 1 bileşen, sonra ek JLabel, sonra başka bir bileşen koyun. Ekstra JLabel'u hareket ettirdiğinizde, son bileşen ilk bileşenden "uzak" kalacak ve bu ikisi arasında bir boşluk göreceksiniz. Bu son konu bir sorun değilse

, sadece, FlowLayout (veya başka LayoutManager) uzatmak layoutContainer geçersiz kılmak ve istediğiniz her yerde ekstra JLabel yerleştirebilirsiniz.

SSCCE` `için
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 katılıyorum, muhtemelen sorumu cevaplandırıyorum ....., daha iyisi, daha güvenli [JProgressBar'ı Kapsayıcı olarak kullan (her zamanki gibi)] (http: // stackoverflow).com/a/18355235/714968), btw bu soru benim cevabım var, benim cevabım yok benim bilgim dayanıyor – mKorbel

+0

@mKorbel Bir kap olarak 'JProgressBar' kullanmak için bir dezavantajı var: ilerleme çubuğu tüm üzerinde gerecek sağlanan sınırlar oldukça garip görünüyor. –

+0

sınırları, kullanılan LayoutManager'ın, örn. GBC, JPanel için aynı soruna neden oldu, bu doğru Swing standart değil, Htlm5/JavaFX gereksinimleri – mKorbel