Моя цель - создать окно с двумя панелями разного цвета на заднем плане. Каждый из них покрывает определенный процент экрана, и это периодически меняется. Я сделал это, создав JSplitPane
. Но теперь я хочу добавить JLabel
, показывающий некоторые данные перед всем этим в середине экрана. Как бы я это сделал?
@czdepski просто раскрашивает фон разными цветами, но расположение разделителя между ними должно постоянно меняться
Изменения при взаимодействии с пользователем? Я спрашиваю, потому что можно просто нарисовать фон (без JSplitPane), а затем вы можете поместить на него компоненты, использовать что-то вроде многослойной панели или компонентов абсолютного позиционирования, все зависит от ваших потребностей.
@czdepski нет, это не должно меняться при взаимодействии с пользователем.
Как насчет использования JLayer
: Как украсить компоненты классом JLayer (Учебники по Java ™> Создание графического интерфейса пользователя с помощью JFC / Swing> Использование других функций Swing)
import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.*;
public class JLayerTest {
public Component makeUI() {
JSplitPane splitPane = new JSplitPane();
splitPane.setResizeWeight(.4);
splitPane.setLeftComponent(makeLabel(Color.RED));
splitPane.setRightComponent(makeLabel(Color.GREEN));
//splitPane.setEnabled(false);
//splitPane.setDividerSize(0);
JPanel rubberStamp = new JPanel();
JLabel label = makeLabel(Color.BLUE);
label.setText("JLabel");
label.setForeground(Color.WHITE);
label.setBorder(BorderFactory.createLineBorder(Color.BLUE, 50));
LayerUI<JSplitPane> layerUI = new LayerUI<JSplitPane>() {
@Override public void paint(Graphics g, JComponent c) {
super.paint(g, c);
Dimension d = label.getPreferredSize();
int x = (c.getWidth() - d.width) / 2;
int y = (c.getHeight() - d.height) / 2;
SwingUtilities.paintComponent(g, label, rubberStamp, x, y, d.width, d.height);
}
};
return new JLayer<>(splitPane, layerUI);
}
public static JLabel makeLabel(Color color) {
JLabel label = new JLabel();
label.setOpaque(true);
label.setBackground(color);
return label;
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new JLayerTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}
}
Большое спасибо, выглядит довольно сложно, но вроде работает :)
Учитывая ваше описание, я предпочитаю использовать подход paintComponent
. Вы просто рисуете 2 прямоугольника на фоне компонентов и по-прежнему позиционируете компоненты как обычно, так просто:
JFrame f = new JFrame();
f.setPreferredSize(new Dimension(600, 600));
f.pack();
f.setLayout(new BorderLayout());
JPanel p = new JPanel(new FlowLayout()) {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int perc = (int)((float)getWidth()*0.3f); // set % to fill
g.setColor(Color.RED);
g.fillRect(0, 0, perc, g.getClipBounds().height);
g.setColor(Color.BLUE);
g.fillRect(perc, 0, getWidth()-perc, getHeight());
}
};
f.add(p);
p.add(new JButton("test"));
f.setVisible(true);
В моем примере это делается на JPanel
, но это можно сделать прямо на JFrame
, а затем накладывать на него JButton
, используя FlowLayout
. Вот результат:
Спасибо большое, не придумал такой подход!
Вам нужна панель с компонентами или просто раскрасить фон разными цветами?