2013-07-16 4 views
1

Я пытаюсь отобразить JLabel s сверху JProgressBar, чтобы у меня был фантазийный форматированный текст на JProgressBar.Показать JPanels поверх JProgressBar

Вот конструктор для моего компонента, который простирается JPanel:

public InfoDisplay() { 
    //setLayout(new GridLayout(0, 1)); 
    setLayout(new OverlayLayout(this)); 

    lblPlayer = new JLabel(); 
    lblPlayer.setName("Owner"); 
    lblUnit = new JLabel(); 
    lblUnit.setName("Unit"); 
    lblCoords = new JLabel(); 
    lblCoords.setName("Coordinates"); 
    lblResources = new JLabel(); 
    lblResources.setName("Resouces"); 

    prgProgress = new JProgressBar(); 
    prgProgress.setMaximum(4); 
    prgProgress.setStringPainted(true); 

    fmtDefault = "<html><font color='gray'>%s:</font> %s</html>"; 

    JPanel pnlInfo = new JPanel(); 
    pnlInfo.setLayout(new FlowLayout(FlowLayout.LEADING)); 
    pnlInfo.setOpaque(false); 
    pnlInfo.add(lblPlayer); 
    pnlInfo.add(lblUnit); 
    pnlInfo.add(lblCoords); 
    pnlInfo.add(lblResources); 
    add(pnlInfo); 
    add(prgProgress); 

    displayInfo(Collections.EMPTY_LIST); 
    setProgress("Upkeep", 2); 
} 

Я попытался с помощью OverlayLayout, который достигает этой цели при создании формы. Однако, когда обновления JProgressBar, он закрывает другую панель, которая содержит текстовые поля.

Я также пробовал использовать JLayeredPane, но мне пришлось бы написать собственный менеджер компоновки для этого, и я надеялся избежать выполнения всего кода изменения размера вручную для такой простой вещи.

Есть ли у кого-нибудь другие решения или идеи?

+0

Вы пробовали (с 'OverlayLayout') прибавление прогресс бар первым? – MadProgrammer

+0

Да, и когда я это сделал, он закрыл панель, полную JLabels, вместо того, чтобы ждать обновления. Я думаю, проблема заключается в том, чтобы найти способ держать JProgressBar на дне навсегда. –

+1

Попробуйте добавить repaint() на главной панели после обновления индикатора выполнения. Затем оба компонента должны быть перекрашены в одно и то же время. – camickr

ответ

1

Более простой подход состоит в том, чтобы просто добавить панель в индикатор выполнения, тогда вам не нужно беспокоиться о вызове перерисовки. Индикатор выполнения автоматически перекрасит его дочерний компонент:

См. Учебник Swing по телефону How to Use Progress Bars. Я добавил следующий код в ProgressBarDemo:

progressBar.setLayout(new BorderLayout()); 
JPanel child = new JPanel(new BorderLayout()); 
child.setOpaque(false); 
child.add(new JLabel("WEST"), BorderLayout.WEST); 
child.add(new JLabel("EAST"), BorderLayout.EAST); 
progressBar.add(child); 
+0

Перекраска работала, но добавление компонентов в JProgressBar вызывает проблемы с изменением размера ... JPanel не понимает границ компонентов внутри. Когда я добавляю панель, она не перекрашивает своих детей. Ручной вызов перерисовки - лучшее решение. –

+0

Я хотел сказать, что JProgressBar не понимает границ компонентов внутри. –

+1

@scott_fakename, может быть, использовать другой менеджер компоновки. GridBadLayout скроет панель до центра, если вы не используете значение weightX/Y. Возможно, BorderLayout - лучший выбор. См. Обновленный пример. Дело в том, что вы можете рассматривать индикатор выполнения как панель. Вы даже можете добавить компоненты непосредственно на индикатор выполнения, не добавляя их сначала на панель. – camickr