Swing - переход на следующую страницу & rdquo; при нажатии кнопки [дублировать]

Необработанный тип - это имя общего класса или интерфейса без аргументов типа. Например, с учетом общего класса Box:

public class Box {
    public void set(T t) { /* ... */ }
    // ...
}

Чтобы создать параметризованный тип Box, вы указываете фактический аргумент типа для параметра формального типа T:

Box intBox = new Box<>();

Если аргумент фактического типа опущен, вы создаете необработанный тип Box:

Box rawBox = new Box();

. Поэтому Box является необработанным типом родового типа Box. Однако не общий тип или тип интерфейса не является сырым типом.

Необработанные типы отображаются в устаревшем коде, потому что многие классы API (например, классы Collections) не были типичными до JDK 5.0. При использовании сырых типов вы, по существу, получаете поведение перед генериками - Box дает вам Object s. Для обратной совместимости допускается присвоение параметризованного типа его необработанному типу:

Box stringBox = new Box<>();
Box rawBox = stringBox;               // OK

Но если вы назначаете сырой тип параметризованному типу, вы получите предупреждение:

Box rawBox = new Box();           // rawBox is a raw type of Box
Box intBox = rawBox;     // warning: unchecked conversion

Вы также получаете предупреждение, если используете необработанный тип для вызова общих методов, определенных в соответствующем родовом типе:

Box stringBox = new Box<>();
Box rawBox = stringBox;
rawBox.set(8);  // warning: unchecked invocation to set(T)

Предупреждение показывает, что необработанные типы обходят общие проверки типа, откладывая улов небезопасных код для выполнения. Поэтому вам следует избегать использования необработанных типов.

В разделе «Тип стирания» содержится дополнительная информация о том, как компилятор Java использует необработанные типы.

Непроверенные сообщения об ошибках

As упомянутый ранее, при смешивании устаревшего кода с общим кодом вы можете столкнуться с предупреждающими сообщениями, подобными следующим:

Примечание: Example.java использует непроверенные или небезопасные операции.

Примечание. : Перекомпиляция с -Xlint: не проверяется для деталей.

blockquote>

Это может произойти при использовании более старого API, который работает с необработанными типами, как показано в следующем примере:

public class WarningDemo {
    public static void main(String[] args){
        Box bi;
        bi = createBox();
    }

    static Box createBox(){
        return new Box();
    }
}

Термин «непроверенный» означает, что компилятор не имеет достаточной информации о типе для выполнения всех проверок типа, необходимых для обеспечения безопасности типа. Предупреждение «unchecked» по умолчанию отключено, хотя компилятор дает подсказку. Чтобы просмотреть все «непроверенные» предупреждения, перекомпилируйте с помощью -Xlint: unchecked.

Повторная компиляция предыдущего примера с -Xlint: unchecked показывает следующую дополнительную информацию:

WarningDemo.java:4: warning: [unchecked] unchecked conversion
found   : Box
required: Box
        bi = createBox();
                      ^
1 warning

Чтобы полностью отключить unchecked warnings, используйте флаг -Xlint: -unchecked. Аннотации @SuppressWarnings("unchecked") подавляют непроверенные предупреждения. Если вы не знакомы с синтаксисом @SuppressWarnings, см. Аннотации.

Исходный источник: Учебники по Java

39
задан Andrew Thompson 26 February 2014 в 08:17
поделиться

14 ответов

Ваш прецедент, кажется идеальным для CardLayout .

В макете карты вы можете добавить несколько панелей в одном и том же месте, но затем показать или скрыть, по одной панели за раз .

49
ответ дан Swapnonil Mukherjee 21 August 2018 в 05:35
поделиться
  • 1
    При использовании CardLayout имейте в виду, что предпочтительный размер панели, которая ее использует, будет размером с панелью LARGEST в макете. Если вы хотите, чтобы пространство было исправлено, вам нужно будет использовать setVisible (false) и setPreferredSize (новое измерение (0,0)), чтобы скрыть компонент. – Joseph Gordon 21 October 2008 в 16:23
  • 2
    Раньше я не слышал о CardLayout. Спасибо - был идеален для чего-то, что мне нужно было сделать. – I82Much 14 April 2010 в 23:04
  • 3
    Да. Это правильный путь. Может быть, самое лучшее. – WesternGun 1 March 2017 в 14:09

Проблема: мой компонент не появляется после того, как я добавил его в контейнер.

Вам нужно вызвать revalidate и repaint после добавления перед тем, как он появится в вашем контейнере.

Источник: http://docs.oracle.com/javase/tutorial/uiswing/layout/problems.html

0
ответ дан Arthur Ronald 21 August 2018 в 05:35
поделиться

Все зависит от того, как его использовать. Если вам нужно переключаться между этими двумя панелями, используйте CardLayout. Если вы только переключаетесь с первого на второй и (и не возвращаетесь назад), я бы использовал предложение telcontar и просто заменил его. Хотя если JPanel не единственная вещь в вашем фрейме, я бы использовал remove (java.awt.Component) вместо removeAll.

Если вы находитесь где-то между этими двумя в основном это компромисс между временным пространством. CardLayout сэкономит ваше время, но займет больше памяти, если вы будете постоянно держать эту всю панель в памяти. Но если вы просто замените панель, когда это необходимо, и постройте ее по требованию, вам не нужно поддерживать этот круг, но требуется больше времени для переключения.

Также вы можете попробовать использовать JTabbedPane для использования вкладок (это даже проще, чем CardLayout, потому что оно автоматически обрабатывает отображение / скрытие)

3
ответ дан Community 21 August 2018 в 05:35
поделиться
class Frame1 extends javax.swing.JFrame {

    remove(previouspanel); //or getContentPane().removeAll();

    add(newpanel); //or setContentPane(newpanel);

    invalidate(); validate(); // or ((JComponent) getContentPane()).revalidate();

    repaint(); //DO NOT FORGET REPAINT

}

Иногда вы можете выполнять работу без использования повторной аттестации, а иногда и без использования repaint.My советуем использовать оба.

6
ответ дан giannis christofakis 21 August 2018 в 05:35
поделиться

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

1
ответ дан James A Wilson 21 August 2018 в 05:35
поделиться

1) Установка первой панели:

JFrame frame=new JFrame();
frame.getContentPane().add(new JPanel());

2) Замена панели:

frame.getContentPane().removeAll();
frame.getContentPane().add(new JPanel());

Также обратите внимание, что вы должны сделать это в потоке события, чтобы обеспечить это использует SwingUtilities.invokeLater или SwingWorker

23
ответ дан jjnguy 21 August 2018 в 05:35
поделиться

У меня была такая же проблема !! Increadible !! Решение, которое я нашел, было:

  1. Добавление всех компонентов (JPanels) в контейнер;
  2. Использование метода setVisible (false) для всех из них;
  3. В пользовательском действии установите setVisible (true) на панель, которую я хотел показать.
// Hiding all components (JPanels) added to a container (ex: another JPanel)
for (Component component : this.container.getComponents()) {
      component.setVisible(false);
}
// Showing only the selected JPanel, the one user wants to see
panel.setVisible(true);

Нет revalidate (), no validate (), нет необходимости в CardLayout .

1
ответ дан Mayur Birari 21 August 2018 в 05:35
поделиться

Я предлагаю вам добавить обе панели при создании фрейма, а затем изменить видимую панель, вызвав setVisible (true / false) на обоих. При вызове setVisible родитель будет уведомлен и попросит перекрасить себя.

0
ответ дан Riduidel 21 August 2018 в 05:35
поделиться

О действии пользователя:

// вам нужно что-то делать по линиям

myJFrame.getContentPane().removeAll()
myJFrame.getContentPane().invalidate()

myJFrame.getContentPane().add(newContentPanel)
myJFrame.getContentPane().revalidate()

. Тогда вы можете изменить размер вашего wndow по мере необходимости.

5
ответ дан ShawnD 21 August 2018 в 05:35
поделиться

Просто вызовите метод pack () после установки ContentPane, (java 1.7, может быть, старше) следующим образом:

JFrame frame = new JFrame();  
JPanel panel1 = new JPanel(); 
JPanel panel2 = new JPanel(); 
....
frame.setContentPane(panel1);
frame.pack();
...

frame.setContentPane(panel2);
frame.pack();
...
0
ответ дан Sumit Singh 21 August 2018 в 05:35
поделиться
frame.setContentPane(newContents());
frame.revalidate(); // frame.pack() if you want to resize.

Помните, что Java использует передачу «копировать ссылку по значению». Таким образом, изменение переменной не изменит копии ссылки, переданной другим методам.

Также обратите внимание, что JFrame очень сбивает с толку имя юзабилити. Добавление компонента или настройка макета (обычно) выполняет операцию на панели содержимого. Как ни странно, получение макета действительно дает вам менеджер компоновки фрейма.

17
ответ дан Tom Hawtin - tackline 21 August 2018 в 05:35
поделиться
  • 1
    Том, спасибо за ваш ответ. Я не собираюсь заменять область содержимого, а именно jpanel, размещенную на нем (например, frame.add (jpanel1), frame.add (jpanel2), frame.add (jpanel3)). Не могли бы вы предложить разумное решение в коде? – yanchenko 20 October 2008 в 13:38
  • 2
    Эй, Джон, ваш прецедент, кажется идеальным для CardLayout. java.sun.com/docs/books/tutorial/uiswing/layout/card.html В макете карты вы можете добавить несколько панелей в одном и том же месте, но затем показать или скрыть, по одной панели за раз , – Swapnonil Mukherjee 20 October 2008 в 13:49
  • 3
    @swapnonil: Сделайте так, чтобы я мог проголосовать. :) – Michael Myers♦ 20 October 2008 в 14:54
  • 4
    При использовании метода setContentPane () могут возникать проблемы. У меня были случаи, когда все (пользовательские) курсоры больше не появлялись после его вызова. – xastor 17 January 2011 в 14:36

вы можете использовать метод замены макета:

layout.replace(existingComponent, newComponent)

существующие и новые компоненты также могут быть JPanels.

-1
ответ дан user221678 21 August 2018 в 05:35
поделиться

Ответ на layout.replace () только существует / работает в Менеджере GroupLayout.

Другие Менеджеры макетов (CardLayout, BoxLayout и т. д.) НЕ поддерживают эту функцию, но требуют сначала RemoveLayoutComponent (а затем AddLayoutComponent (назад снова. :-) [Только установив запись прямо]

1
ответ дан Warren K 21 August 2018 в 05:35
поделиться
6
ответ дан giannis christofakis 1 November 2018 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: