Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Работа с панелями


Автор: Shorr Kan 12.1.2004, 07:17
1. Создаю две панели. КОгда они в одном файле - все работает. Когда же они в двух разных файлах (каждая - в своем) - по нажатию на кнопку в одной панели - не могу обратиться в другую. Как это сделать?

2. Создал две панельки, а они ровно пополам делят весь фрейм. Как каждой задать определенный размер?

Автор: SmaLL 12.1.2004, 09:00
Почитай про LayoutManager's http://java.sun.com/docs/books/tutorial/index.html
А лучше выкачай весь тутор.

Автор: AntonSaburov 12.1.2004, 10:37
Shorr Kan
Модератор: Делаю замечание - один вопрос, один топик. Это правило не из вредности, а для удобства. Сам догадайся, на какой вопрос тебе ответили

1. Без кода помочь невозможно.

2. Почитать про LayoutManager, что посоветовал SmaLL или создать свои панельки (новые классы) и переопределить в них getPreferredSize() и getMinimumSize()

Автор: Shorr Kan 13.1.2004, 06:57
Хорошо, в следующий раз буду по одному вопросу задавать. Сейчас продолжаю первый, так как второй ясено и закрыт. Спасибо.

1. JBuilder создает проект из двух файлов. Первый посылать не буду - он, полагаю, для всех понятен. Там я ничего не трогал. Во втором файле я просто поставил ссылки на два моих дополнительных класса. Вот текст этого, второго, файла:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class panelapp extends JFrame {
JPanel contentPane;
BorderLayout borderLayout1 = new BorderLayout();

JPanel panel_1;
JPanel panel_2;

//Construct the frame
public panelapp() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}

//Component initialization
private void jbInit() throws Exception {
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(new GridLayout(1, 2));
this.setBounds(100,100,400,300);
this.setTitle("panelapp");

panel_1 = new panel1();
panel_2 = new panel2();

contentPane.add(panel_1);
contentPane.add(panel_2);
}

//Overridden so we can exit when window is closed
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}
}


Теперь текст файла panel1:


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class panel1 extends JPanel {

public panel1() {
this.setBackground(Color.yellow);
}
}


И файл panel2:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class panel2 extends JPanel {

Button but_1;
Button but_2;

public panel2() {
this.setBackground(Color.red);
but_1= new Button("123");
add(but_1);
but_2= new Button("456");
add(but_2);
}

public boolean action(Event evt, Object obj)
{
if(evt.target instanceof Button)
{
if(evt.target.equals(but_1))
{
this.setBackground(Color.red);
}
if(evt.target.equals(but_2))
{
this.setBackground(Color.yellow);
}
}
return false;
}
}


Когда это было в одном файле - все работало прекрасно. Сейчас, конечно, нет. Понятно, почему - глобальных переменных не существует в этом языке. Но как это исправить?


Автор: AntonSaburov 13.1.2004, 11:35
Скопировал все три класса по разным файлам в одну директорию и запустил следующее:
Код
javac *.java

Все прекрасно собралось. Правда main нет и посему не запустить. Но все нормально собирается.

Автор: Shorr Kan 14.1.2004, 06:04
Файл, содержащий main таков:

import javax.swing.UIManager;

public class twopanel {
boolean packFrame = false;

//Construct the application
public twopanel() {
panelapp frame = new panelapp();
//Validate frames that have preset sizes
//Pack frames that have useful preferred size info, e.g. from their layout
if (packFrame) {
frame.pack();
}
else {
frame.validate();
}
frame.setVisible(true);
}

//Main method
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch(Exception e) {
e.printStackTrace();
}
new twopanel();
}
}


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

Автор: AntonSaburov 14.1.2004, 12:36
Цитата
Я так понимаю, что проблема в области видимости.

Так тогда просто ничего не собралось бы.

Я поиграл - цвет меняется. То все желтенькое, то половина красненькая. Все нормально.

Автор: Shorr Kan 15.1.2004, 06:51
Да? А у меня не работает. Может это быть из-за того, что у меня используется jdk1.2.2 ?

Автор: Shorr Kan 15.1.2004, 07:03
А сейчас у меня вот что происходит:

C:\JBuilder35\jdk1.2.2\bin>javac *.java
Note: panel2.java uses or overrides a deprecated API. Recompile with "-deprecat
ion" for details.
1 warning

Автор: AntonSaburov 15.1.2004, 10:40
Цитата
А сейчас у меня вот что происходит:

Во-первых, надо запустить javac с флагом -deprecation
javac -deprecation *.java
и посмотреть что именно не так.

А во-вторых, у меня под 1.4.2_03 (самая распоследняя версия - требуют от нас знаете ли) никаких подобных сообщений нет.

Автор: Shorr Kan 16.1.2004, 07:04
Я удалил всю возможную яву, даже все IDE... ПОставил SE 1.4.2_03. Но там нет файла javac.exe

Как быть?

Автор: Shorr Kan 16.1.2004, 15:32
Забыл уточнить - J2RE SE 1.4.2_03. Вот ее я поставил.
(если я все правильно понял, то J2RE и JDK - разные вещи...)

Автор: AntonSaburov 16.1.2004, 15:39
Цитата
Забыл уточнить - J2RE SE 1.4.2_03. Вот ее я поставил.
(если я все правильно понял, то J2RE и JDK - разные вещи...)


Надо ставить SDK - только там есть компилятор и еще некторые утилиты.
Где найти - можно посмотреть в FAQ, там указано.

Автор: Sardar 18.1.2004, 03:59
Не найденна переменная. У меня такое впечатление что ты хочешь изменить цвет панели кнопкой из другой панели.
1) в Javа нет глобальных(никому не пренадлежащих) переменных(и функций тоже) -> Документация -> азы.
2) если ты хочешь изменить свойство обьекта то ты должен иметь на него ссылку, см. выше.
Вот простое решение:
Код

//файл panel2.java
public class panel2 extends JPanel {
JPanel brother;
...
public panel2(JPanel br) {
this.brother=br;
...
}

public boolean action(Event evt, Object obj) {
   if(evt.target instanceof Button) {
       if(evt.target.equals(but_1)) {
           this.setBackground(Color.red);
           brother.setBackground(Color.yellow);
       }
       if(evt.target.equals(but_2)) {
           this.setBackground(Color.yellow);
           brother.setBackground(Color.red);
       }
   }
   return false;
}
//файл panelapp.java
private void jbInit() throws Exception {
...
panel_1 = new panel1();
panel_2 = new panel2(panel_1);
...
}


Shorr Kan мне кажется, что тебе надо повторить Java с самого начала, с каким-нибудь хорошим учебником.
PS. Не открывай второй топик с одинаковой темой.

Автор: Shorr Kan 19.1.2004, 06:14
О, большое спасибо! Именно это и хотел сделать.

p.s. Только Java мне не повторять надо... А изучать smile.gif . Я только влез в нее.

Автор: summe 9.10.2012, 17:09
Здравствуйте! В процессе изучения языка возник вопрос: можно ли в одном фрейме (или апплете) совместить наличие графики Graphucs2D и, например, кнопок или текстовую область? Если компонент с графикой добавляю в фрейм, а затем панель с кнопками, остаются одни кнопки smile
Например вот так будет только компонент calc, содержащий графику.
Код

class DateFrame extends JFrame
{
    public DateFrame() 
            {
            setTitle("Calendar");
            setSize(xx,yy);
            
            mypan = new JPanel();
            JButton Back= new JButton("Назад");
            JButton Prev= new JButton("Вперед");
           // mypan.add(Back);
            //mypan.add(Prev);
            
            add(mypan);
            CalComp calc= new CalComp();
            //mypan.add(calc);
           add(calc);
            

            }
    public static final int xx=600;
    public static final int yy=300;
    private JPanel mypan;
}


А вот так будут только кнопки:
Код

class DateFrame extends JFrame
{
    public DateFrame() 
            {
            setTitle("Calendar");
            setSize(xx,yy);
            
            mypan = new JPanel();
            JButton Back= new JButton("Назад");
            JButton Prev= new JButton("Вперед");
            mypan.add(Back);
            mypan.add(Prev);
            
            
            CalComp calc= new CalComp();
            //mypan.add(calc);
           add(calc);
           add(mypan);
            

            }
    public static final int xx=600;
    public static final int yy=300;
    private JPanel mypan;
}

Поясните или ткните носом куда надо, пожалуйста ))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)