Не уверен, что вы ищете, но вы можете добавить JMenuBar
в JFrame
- JFrame.setJMenuBar () . Подробнее см. Как использовать меню .
Редактировать:
Ниже приведен слишком упрощенный пример неупорядоченного фрейма с меню, просто для демонстрации идеи.
Вы можете обратиться к существующим решениям - для этой цели JIDE имеет ResizableFrame
. Это часть открытого источника JIDE-oss . Вещество L & amp; F поддерживает настройку заголовка (см. Что случилось с веществом LaF? ). Вы также можете очень эффективно использовать классы ComponentMover
и ComponentResizer
by @camickr, см. Статью Resizing Components для более подробной информации.
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class UndecoratedFrameDemo {
private static Point point = new Point();
public static void main(String[] args) {
final JFrame frame = new JFrame();
frame.setUndecorated(true);
frame.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
point.x = e.getX();
point.y = e.getY();
}
});
frame.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
Point p = frame.getLocation();
frame.setLocation(p.x + e.getX() - point.x,
p.y + e.getY() - point.y);
}
});
frame.setSize(300, 300);
frame.setLocation(200, 200);
frame.setLayout(new BorderLayout());
frame.getContentPane().add(new JLabel("Drag to move", JLabel.CENTER),
BorderLayout.CENTER);
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("Menu");
menuBar.add(menu);
JMenuItem item = new JMenuItem("Exit");
item.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
menu.add(item);
frame.setJMenuBar(menuBar);
frame.setVisible(true);
}
}
Вы забыли последнее " напечатайте значение N оператора.
Скажем, мы вызываем это с Exercise(1)
. Тогда это означает, что оно оценивается как:
этот вызов Exercise(2)
приведет к:
Exercise(2):
print 2
Exercise(2+1)
print 2
вызов Exercise(3)
приведет только к двум операторам print
, поскольку условие в выражении if
ложно, следовательно, :
Exercise(3):
print 3
print 3
Если мы теперь выполним подстановку, мы получим:
Exercise(1):
print 1
print 2
print 3
print 3
print 2
print 1
, который действительно даст ожидаемую последовательность.
Для N = 1
print 1;
if(N<3) --> Exercise (1+1); //the condition is TRUE here. So the function will be called again for N=2
print 1;
Для N = 2
print 2;
if(N<3) --> Exercise (2+1); // Condition is again TRUE. So the function is called for N=3
print 2;
Для N = 3
print 3;
if(N<3) --> Exercise (3+1); // Condition is FALSE here. So the function won't be called
print 3;
Структура будет похожа на [117 ]
print 1;
print 2;
print 3;
print 3;
print 2;
print 1;
Когда я хочу знать, что делает алгоритм, я часто кодирую и выполняю его. Вставка операторов print
для отслеживания выполнения и потока данных помогает показать иерархию вызовов.
indent = ""
def exercise(n):
global indent
indent += " "
print(indent, "ENTER", n)
# Original assignment, with assigned output not indented
print("REAL", n)
if n < 3:
exercise(n+1)
print("REAL", n)
print(indent, "LEAVE", n)
indent = indent[2:]
exercise(1)
Вывод: здесь трассировка выполнения с выводом присваивания, помеченным как «REAL». Функции входа и выхода являются торговыми и с отступом.
ENTER 1
REAL 1
ENTER 2
REAL 2
ENTER 3
REAL 3
REAL 3
LEAVE 3
REAL 2
LEAVE 2
REAL 1
LEAVE 1
Да, это легко сделать с помощью пары петель. Является ли это «большой разницей», зависит от вашей оценочной функции. Например:
for i in range(1, n+1):
print(n)
for i in range(n, 0, -1):
print(n)
Если ваша обработка отдельного случая тривиальна (например, print(n)
), то это легко. Когда ваша итерация от одного элемента к следующему тривиальна (например, n+1
), тогда это легко. Однако, когда любой из них является сложным, тогда рекурсия часто является более подходящим способом описания и реализации процесса.