Необработанный тип - это имя общего класса или интерфейса без аргументов типа. Например, с учетом общего класса 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
Ваш прецедент, кажется идеальным для CardLayout .
В макете карты вы можете добавить несколько панелей в одном и том же месте, но затем показать или скрыть, по одной панели за раз .
Проблема: мой компонент не появляется после того, как я добавил его в контейнер.
Вам нужно вызвать revalidate и repaint после добавления перед тем, как он появится в вашем контейнере.
Источник: http://docs.oracle.com/javase/tutorial/uiswing/layout/problems.html
Все зависит от того, как его использовать. Если вам нужно переключаться между этими двумя панелями, используйте CardLayout. Если вы только переключаетесь с первого на второй и (и не возвращаетесь назад), я бы использовал предложение telcontar и просто заменил его. Хотя если JPanel не единственная вещь в вашем фрейме, я бы использовал remove (java.awt.Component) вместо removeAll.
Если вы находитесь где-то между этими двумя в основном это компромисс между временным пространством. CardLayout сэкономит ваше время, но займет больше памяти, если вы будете постоянно держать эту всю панель в памяти. Но если вы просто замените панель, когда это необходимо, и постройте ее по требованию, вам не нужно поддерживать этот круг, но требуется больше времени для переключения.
Также вы можете попробовать использовать JTabbedPane для использования вкладок (это даже проще, чем CardLayout, потому что оно автоматически обрабатывает отображение / скрытие)
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 советуем использовать оба.
Другие люди ответили на вопрос. Я хочу предложить вам использовать JTabbedPane вместо замены содержимого. Как правило, плохо видеть, что визуальные элементы вашего приложения исчезают или заменяются другим контентом. Конечно, есть исключения для каждого правила, и только вы и ваше сообщество пользователей можете выбрать наилучший подход.
1) Установка первой панели:
JFrame frame=new JFrame();
frame.getContentPane().add(new JPanel());
2) Замена панели:
frame.getContentPane().removeAll();
frame.getContentPane().add(new JPanel());
Также обратите внимание, что вы должны сделать это в потоке события, чтобы обеспечить это использует SwingUtilities.invokeLater или SwingWorker
У меня была такая же проблема !! Increadible !! Решение, которое я нашел, было:
// 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 .
Я предлагаю вам добавить обе панели при создании фрейма, а затем изменить видимую панель, вызвав setVisible (true / false) на обоих. При вызове setVisible родитель будет уведомлен и попросит перекрасить себя.
О действии пользователя:
// вам нужно что-то делать по линиям
myJFrame.getContentPane().removeAll()
myJFrame.getContentPane().invalidate()
myJFrame.getContentPane().add(newContentPanel)
myJFrame.getContentPane().revalidate()
. Тогда вы можете изменить размер вашего wndow по мере необходимости.
Просто вызовите метод 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();
...
frame.setContentPane(newContents());
frame.revalidate(); // frame.pack() if you want to resize.
Помните, что Java использует передачу «копировать ссылку по значению». Таким образом, изменение переменной не изменит копии ссылки, переданной другим методам.
Также обратите внимание, что JFrame
очень сбивает с толку имя юзабилити. Добавление компонента или настройка макета (обычно) выполняет операцию на панели содержимого. Как ни странно, получение макета действительно дает вам менеджер компоновки фрейма.
вы можете использовать метод замены макета:
layout.replace(existingComponent, newComponent)
существующие и новые компоненты также могут быть JPanels.
Ответ на layout.replace () только существует / работает в Менеджере GroupLayout.
Другие Менеджеры макетов (CardLayout, BoxLayout и т. д.) НЕ поддерживают эту функцию, но требуют сначала RemoveLayoutComponent (а затем AddLayoutComponent (назад снова. :-) [Только установив запись прямо]