Ширина шрифта Swing JList - PullRequest
1 голос
/ 24 ноября 2010

Я делаю Java-программу, которая производит рецепт в списке, в котором будут отображаться количество товаров, название товара и цена товара.Мне нужно дополнить строку так, чтобы название было посередине, а количество предметов и стоимость были на стороне эфира.Можете ли вы найти с в пикселях строк, тогда я могу рассчитать количество пробелов, необходимых для достижения желаемого формата.Спасибо

1 Ответ

2 голосов
/ 24 ноября 2010

Вот как вы получите ширину строки:

Graphics2D g2d = (Graphics2D)g;
FontMetrics fontMetrics = g2d.getFontMetrics();

int width = fontMetrics.stringWidth("aString");
int height = fontMetrics.getHeight();

...

Но, когда я снова прочитал ваш вопрос, я подумал: почему бы не использовать ListCellRenderer в JList ? Работает как хочешь:

http://img189.imageshack.us/img189/7509/jlistexample.jpg

А вот код для этого:

public static void main(String... args) {

    JFrame frame = new JFrame("Test");

    JList list = new JList(new String[] { 
            "Hello", "World!", "as", "we", "know", "it" });

    list.setCellRenderer(new ListCellRenderer() {

        @Override
        public Component getListCellRendererComponent(
                JList list, 
                Object value,
                int index, 
                boolean isSelected, 
                boolean cellHasFocus) {

            JPanel panel = new JPanel(new GridBagLayout());

            if (isSelected)
                panel.setBackground(Color.LIGHT_GRAY);

            panel.setBorder(BorderFactory.createMatteBorder(
                    index == 0 ? 1 : 0, 1, 1, 1, Color.BLACK));

            GridBagConstraints gbc = new GridBagConstraints();

            gbc.anchor = GridBagConstraints.EAST;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(4,4,4,4);

            // index
            gbc.weightx = 0;
            panel.add(new JLabel("" + index), gbc);

            // "name"
            gbc.weightx = 1;
            panel.add(new JLabel("" + value), gbc);

            // cost
            gbc.weightx = 0;
            String cost = String.format("$%.2f", Math.random() * 100);
            panel.add(new JLabel(cost), gbc);


            return panel;
        }
    });

    frame.add(list);

    frame.setSize(400, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}
...