Что можно использовать вместо кнопок в JPanel, чтобы получить одинаковый внешний вид во всех ОС? - PullRequest
1 голос
/ 10 февраля 2011

Мне нужно создать прямоугольную сетку (скажем, 3 на 4), состоящую из квадратов разных цветов. Кроме того, квадраты (ячейки сетки) должны содержать одинаковый короткий текст. На данный момент я решаю проблему, используя кнопки в качестве элементов сетки. Более подробно, у меня есть следующий код:

JPanel fieldPanel = new JPanel();
fieldPanel.setLayout(new GridLayout(nRows, nColumns));
fieldPanel.setMaximumSize(new Dimension(nColumns*cellSize, nRows*cellSize));
for (int i=1; i<=nRows; i++) {
   for (int j=1; j<=nColumns; j++) {
      JButton btn = new JButton("<html><span style='color:#000000; font-size: 11pt;'>" + label + "</span></html>");
      btn.setPreferredSize(new Dimension(cellSize, cellSize));
      btn.setHorizontalTextPosition(SwingConstants.LEFT);
      btn.setBackground(col);
      fieldPanel.add(btn);
   }
}

Этот подход имеет недостаток. Я вижу кнопки разных цветов в Windows 7, но они серые в Windows XP. Чтобы решить эту проблему, я настроил внешний вид вручную:

UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel");

Но это также вызывает проблемы. Это меняет внешний вид основного программного обеспечения, которое вызывает мою программу (моя программа является частью «большого» программного обеспечения).

Итак, я хочу радикально решить проблему. Я хочу заменить кнопки на что-то еще. И я думаю, что наиболее стабильное решение (которое гарантирует одинаковый внешний вид во всех операционных системах - это использование изображений в качестве фона для ячейки сетки (изображения монотонных цветов)). Но тогда мне нужно иметь способ наносить надписи поверх изображений.

Может кто-нибудь, пожалуйста, подскажите, как это можно сделать?

Ответы [ 3 ]

3 голосов
/ 10 февраля 2011

Но тогда мне нужно иметь способ наносить надписи поверх изображений.

Вы можете отобразить текст по центру изображения, используя:

label.setIcon(...);
label.setText("Text over Image");
label.setHorizontalTextPosition(JLabel.CENTER);
label.setVerticalTextPosition(JLabel.CENTER);

Или вы можете использовать одно из предложений из Фоновая панель Запись.

1 голос
/ 10 февраля 2011

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

Другой подход заключается в реализации интерфейса Icon, как показано в этом примере , который также демонстрирует изменение в предложении @ camickr. Результатом является универсальное размещение текста и строгий контроль над рисованием.

0 голосов
/ 15 февраля 2011

Как насчет этого примера

package test;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class PanelBG {
    JFrame f;
    public PanelBG() {
        f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        int nRows = 3;
        int nColumns = 4;
        int cellSize = 50;
        JPanel fieldPanel = new JPanel();
        fieldPanel.setLayout(new GridLayout(nRows, nColumns));
        fieldPanel.setMaximumSize(new Dimension(nColumns*cellSize, nRows*cellSize));
        Color colors[]={
                new Color(115, 114, 83),
                new Color(120, 130, 83),
                new Color(140, 140, 83),
                new Color(160, 180, 83),
                new Color(170, 190, 83),
                new Color(80, 190, 73),
                new Color(100, 120, 83),
                new Color(150, 240, 83),
                new Color(180, 150, 83),
                new Color(210, 190, 83),
                new Color(230, 11, 83),
                new Color(255, 255, 255)
        };
        for (int i=1; i<=nRows; i++) {
           for (int j=1; j<=nColumns; j++) {
              //JButton btn = new JButton("<html><span style='color:#000000; font-size: 11pt;'>"
              //        + label.getText() + "</span></html>");
              //btn.setPreferredSize(new Dimension(cellSize, cellSize));
              //btn.setHorizontalTextPosition(SwingConstants.LEFT);
              //btn.setBackground(new Color(54,36,5));
              //fieldPanel.add(btn);
               JPanel p = new JPanel();
               p.setPreferredSize(new Dimension(cellSize, cellSize));
               JLabel l = new JLabel("Jlabel");
               p.add(l);
               p.setBackground(colors[i*j-1]);
               fieldPanel.add(p);
           }
        }
        f.getContentPane().add(fieldPanel);
        f.pack();
        f.setVisible(true);
    }
    public static void main(String[] args) {
        new PanelBG();
    }
}
...