Когда я сначала изучал Java, мы должны были сделать Yahtzee, и я думал, что будет здорово создать пользовательские компоненты Swing и контейнеры вместо того, чтобы просто тянуть все на одном JPanel
. Преимущество расширения Swing
компоненты, конечно, должны иметь способность добавить поддержку сочетаний клавиш и других функций доступности, которые Вы не можете сделать только при наличии paint()
печать метода симпатичное изображение. Это не может быть сделано лучший способ однако, но это может быть хорошая начальная точка для Вас.
Редактирование 8/6 - Если это не было очевидно из изображений, каждый Умирает, является кнопкой, которую можно нажать. Это переместит его в DiceContainer
ниже. Рассмотрение исходного кода, Вы видите, что каждая кнопка Die оттянута динамично, на основе ее значения.
Вот основные шаги:
JComponent
super()
в Ваших конструкторах MouseListener
Помещенный это в конструктора:
enableInputMethods(true);
addMouseListener(this);
Переопределение эти методы:
public Dimension getPreferredSize()
public Dimension getMinimumSize()
public Dimension getMaximumSize()
Переопределение этот метод:
public void paintComponent(Graphics g)
сумма пространства необходимо работать с тем, когда рисование кнопки определяется [1 110], принятие getMinimumSize()
и getMaximumSize()
возвращает то же значение. Я не экспериментировал слишком много с этим, но, в зависимости от расположения Вы используете для своего GUI, Ваша кнопка могла выглядеть полностью отличающейся.
И наконец, исходный код . В случае, если я пропустил что-либо.
class Throw(object): pass
throw = Throw() # easy sentinel hack
def next(iterator, default=throw):
"""next(iterator[, default])
Return the next item from the iterator. If default is given
and the iterator is exhausted, it is returned instead of
raising StopIteration.
"""
try:
iternext = iterator.next.__call__
# this way an AttributeError while executing next() isn't hidden
# (2.6 does this too)
except AttributeError:
raise TypeError("%s object is not an iterator" % type(iterator).__name__)
try:
return iternext()
except StopIteration:
if default is throw:
raise
return default
( throw = object ()
тоже работает, но при проверке создаются более качественные документы, например help (next)
. None
не подходит, потому что вы должны относиться к next (it)
и next (it, None)
по-разному .)
Р. Кажется, у Пейта есть хороший ответ. Еще один звонок, который следует добавить: если вы пишете код для работы во многих различных версиях Python, вы можете условно определить определение:
try:
next = next
except NameError:
def next():
# blah blah etc
Таким образом, вы в любом случае определите следующий
, но вы используя встроенную реализацию там, где она доступна.
Я использую next = next
, чтобы я мог поместить это определение в модуль, а затем использовать в другом месте моего кода:
from backward import next
Simpler method:
import operator
next = operator.methodcaller("next")
Ned's suggestion about putting it in a try
block works here as well, but if you're going to go that route, one minor note: in Python 3, calling next()
on a non-iterator raises a TypeError
, whereas this version would raise an AttributeError
instead.
Edit: Never mind. As steveha points out, operator.methodcaller()
was only introduced in 2.6, which is a shame.