JScrollPanes в JInternalFrames для ориентации компонентов справа налево - ошибка Java?

StackOverflow https://stackoverflow.com/questions/2004929

Вопрос

Итак, я создал несколько демонстрационных кодов, смотрите Ниже.

Что я вижу, так это то, что если JScrollPane находится внутри JInternalFrame, а ориентация компонента установлена справа налево, то при минимизации фрейма полоса прокрутки остается слева от содержимого.Я бы ожидал, видя RtL, что он останется справа от содержимого, что верно, если панель прокрутки не добавлена во внутренний фрейм (смотрите Оба фрейма - в демо-версии один отображается за другим).

Так это ошибка Java или я забыл что-то сделать?

Вот демонстрационный код:

import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import java.awt.ComponentOrientation;
import java.awt.Dimension;


public class JScrollBarTest
{
    public static void main(String[] a)
    {
        try
        {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch (Exception e) { }

        runInternalFrameDemo();
        runNormalDemo();
    }

    private static void runInternalFrameDemo()
    {
        // Frame...
        final JFrame frame = new JFrame("Internal Frame Demo");
        frame.setSize(new Dimension(500, 500));
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        // Desktop pane...
        JDesktopPane desktopPane = new JDesktopPane();

        // Table...
        JTable table = getTable();

        // Scroll pane...
        JScrollPane scrollPane = new JScrollPane();

        // Internal frame...
        final JInternalFrame internalFrame = new JInternalFrame("Test Internal Frame", true, true, true, true);
        internalFrame.setSize(400, 300);
        internalFrame.setLocation(50, 50);
        internalFrame.setVisible(true);

        // Add everything...
        frame.setContentPane(desktopPane);
        desktopPane.add(internalFrame);
        internalFrame.setContentPane(scrollPane);
        scrollPane.setViewportView(table);

        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                internalFrame.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
                frame.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
                frame.setVisible(true);
            }
        });
    }

    private static void runNormalDemo()
    {
        // Frame...
        final JFrame frame = new JFrame("Normal Demo");
        frame.setSize(new Dimension(500, 500));
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        // Table...
        JTable table = getTable();

        // Scroll pane...
        JScrollPane scrollPane = new JScrollPane();

        // Add everything...
        frame.setContentPane(scrollPane);
        scrollPane.setViewportView(table);

        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                frame.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
                frame.setVisible(true);
            }
        });
    }

    private static JTable getTable()
    {
        final String[] columns = { "test 1", "test 2", "test 3", "test 4" };
        final Object[][] data = { { "1", "2", "3", "4" }, { "1", "2", "3", "4" } };
        final JTable table = new JTable(data, columns);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        return table;
    }
}

Заранее благодарю.

Редактировать:

Приношу извинения за недостаточную ясность - написано в довольно большой спешке.

Проблема в том, что когда я уменьшаю ширина из таблицы, "Обычная демонстрация" (не содержащаяся в JInternalFrame) горизонтальная полоса прокрутки начинается справа, где, как и в случае с "Внутренней демонстрацией фрейма", горизонтальная полоса прокрутки начинается слева.

Есть какие-нибудь идеи?

Это было полезно?

Решение

Как обсуждалось, в Java 1.6, похоже, нет разницы в поведении внутренних и стандартных фреймов.

Ошибка "JScrollPane игнорирует компонентную ориентацию" описывает вашу проблему, но она была исправлена давным-давно.

Ошибка "JScrollPane неправильно верстается с помощью RTL (RIGHT_TO_LEFT)" все еще открыт и может вызвать вашу проблему.

Я нашел решение в Форумы Sun это заставило меня это сделать, хотя проблема была немного другой.Вертикальная полоса прокрутки отображается с правой стороны, а не с левой.

scrollPane.setLayout(new ScrollPaneLayout() {

    @Override
    public void layoutContainer(Container parent) {
        JScrollPane scrollPane = (JScrollPane) parent;
        scrollPane.setComponentOrientation(
          ComponentOrientation.LEFT_TO_RIGHT);
        super.layoutContainer(parent);
        scrollPane.setComponentOrientation(
          ComponentOrientation.RIGHT_TO_LEFT);
    }
});

Текущее поведение звучит для меня как ошибка, поскольку ошибка (см. Выше) была исправлена.

Другие советы

Я не уверен, что вы видите, но вот что вижу я.

альтернативный текст http://dl.dropbox.com/u/3608004/jframe.png

В обоих случаях полоса прокрутки находится слева (до и после сворачивания), и это правильно.В арабском языке (справа налево) полосы прокрутки по умолчанию расположены слева

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top