Я пытаюсь реализовать взаимодействие между некоторыми самописными элементами графического интерфейса (например, кнопками Java-swing) и JGraphX. Для этого я сначала просто хочу отобразить кнопку рядом с элементом JGraph-Element - и я застрял.
Мой код для отображения самой кнопки работает нормально:
import javax.swing.*;
public class HelloWorld extends JFrame {
public HelloWorld()
{
super("Everything works");
}
public static void main(String[] args)
{
hello_world frame = new hello_world();
frame.setTitle("bub");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 200);
button.setBounds(10, 10, 100, 50);
frame.setVisible(true);
frame.add(button);
}
}
Но как только я добавляю JGraph-Component, кнопка отображается в полноэкранном режиме. Я понятия не имею, почему и как это предотвратить. Мой код:
import javax.swing.*;
import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.view.mxGraph;
public class HelloWorld extends JFrame {
private mxGraph graph;
private Object window;
public HelloWorld()
{
super("Nothing works");
graph = new mxGraph();
window = graph.getDefaultParent();
graph.getModel().beginUpdate();
try
{
Object v2 = graph.insertVertex(window, null, "Hello World!", 200, 150, 80, 30);
}
finally
{
graph.getModel().endUpdate();
}
mxGraphComponent graphComponent = new mxGraphComponent(graph);
getContentPane().add(graphComponent);
}
public static void main(String[] args)
{
hello_world frame = new hello_world();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 200);
JButton button = new JButton("left");
button.setBounds(10, 10, 100, 50);
frame.setVisible(true);
frame.add(button);
}
}
Результат выглядит следующим образом (я вручную изменил размер окна, чтобы показать вам кнопку. Естественно, кнопка просто заполнила бы пространство позади JGraph-Component и поэтому была бы невидимой):
Вы правы, но я почти уверен, что это не главная проблема;)
I'm pretty sure thats not the main problem there Поэтому я и добавил это в качестве комментария. На форуме будут выделены имена классов. Это облегчает нам (или кому-либо еще) чтение вашего кода, если вы следуете стандартам. Нет причин не следовать стандартам. Всем выгодно.




Swing использует менеджеры по расположению. Менеджером компоновки по умолчанию для JFrame является BorderLayout. Когда вы добавляете компонент в рамку, по умолчанию используется ограничение BorderLayout.CENTER. К CENTER из BorderLayout можно добавить только один компонент.
SetBounds (...) будет работать только временно. Как только размер кадра изменяется, вызывается менеджер компоновки, и кнопке будет присвоен новый размер / местоположение в соответствии с правилами менеджера компоновки.
Решение состоит в том, чтобы правильно использовать менеджеры по расположению. Я не уверен, какой макет вы пытаетесь достичь, поэтому все, что я могу предложить, - это прочитать учебник по Swing на Менеджеры по компоновке, чтобы найти рабочие примеры, которые помогут вам начать. Затем вы можете вкладывать панели с разными менеджерами компоновки для достижения желаемого эффекта.
Начните с чего-нибудь простого, например:
frame.add(button, BorderLayout.PAGE_END);
frame.setVisible(true);
//frame.add(button);
Приведенный выше график отобразит ваш график в центре рамки и кнопку внизу.
Каждое произведение в имени класса должно начинаться с символа верхнего регистра. "hello_world" должен быть
HelloWorld. В случае сомнений следуйте формату имен классов, найденному в Java API.